# In Pliant, the standard type to handle character strings is Str.
# String variables must be declared -- if no value is given it's
# value is the empty string ("") if the variable is global.
var Str string
# special characters
string := "[lb]" # character '['
string := "[rb]" # character ']'
string := "[lf]" # line feed
string := "[cr]" # carriage return
string := "[tab]" # tabulation
string := "[0]" # null character
string := "Jon said [dq]hello[dq]" # literal double quotes
#
# multiline text using inline_text meta and parse_text filters defined
# in the Appendix
#
var Str string := inline_text
This is a multiline here document
terminated by indentation rule
(the first indenting space is ignored).
In the multiline, "special" characters have not to be
[quoted].
# remark each lines of string is ended with a [lf]
var Str string := inline_text leftcut
This is a multiline here document
terminated by indentation rule
with left margin given by the leftest string
var Str string := inline_text ignorefirst
! left margin is here
This is a multiline here document
gna with all characters left to the margin ignored,
as long as properly indented. |
var Str s:="some string" # extraction of at most length characters (less if the required # length is not available in the string) -> new string var Str s1 s1 := s offset length s1 := s offset s:len # extracts the end of the string # same, but the string is really a substring (like in Perl) # to do this, we add new methods to Str: method p map s from to arg_rw Str p; arg Str s; arg Int from length check to < s:len p set (s:characters translate Char from) to-from false # s1 map s offset offset+length s1 map s offset s:len-1 # # The equivalent of unpack in Pliant is eparse. However, # no parsing method is present by default for fixed length # strings. # We should create some function FixedStr to create the # type "string of length xxx" and the from_string method # on these types. Then, the unpack could be writen as var FixedStr:5 leading var FixedStr:3 dummy var FixedStr:8 s1 s2 var Str trailing data data eparse leading dummy s1 s2 any:trailing # # A string may be accessed as an array of Char, but if we # way to transfer a Str into an Array of Char, we need a loop # var Array:Char chars for (var Int i) 0 s:len chars i := s i # # s := "This is what you have" # strings do not support backwards indexing as perl does, but we may # add this functionality method s 'new substring' i j -> ss arg Str s ss; arg Int i j strong_definition ss:= s (shunt i<0 s:len+i i) j alias '' '. new substring' # first := string 0 1 # "T" start := string 5 2 # "is" rest := string 13 string:len # "you have" last := string -1 string:len # "e" end := string -4 string:len # "have" piece := string -8 3 # "you" #-------------------- string := "This is what you have" console string #This is what you have |
# characters have type Char in Pliant var Char char:="X" var Int num := char number # gets the ASCII code of char char := character num # ASCII to character #----------------------------- # Here, we use a string var Str string:="Hello" num := string:0:number # ASCII code of first character string := character num # implicit Char->Str cast #----------------------------- var Int ascii_value := "e":number # now 101 var Char char := character 101 # now "e" #----------------------------- var Str hal := "HAL" var Str ibm := hal for (var Int i) 0 ibm:len-1 ibm:i := character hal:i:number+1 |
# Since Pliant++ strings can be accessed one character at a time,
# there's no need to do any processing on the string to convert
# it into an array of characters
var Str s
for (var Int i) 0 s:len-1
# do something with s:i
#------------------------------------------
# we use an Index to sort implicitely the keys
module "/pliant/language/unsafe.pli" # at the moment Index is still considered unsafe
module "/pliant/language/type/set/each.pli" # each.pli has to be linked to explicitely
var (Index Char Bool) seen
var Str string := "an apple a day"
for (var Int i) 0 string:len-1
if not (seen exists string:i)
seen insert string:i true
console "unique chars are: "
each c seen # warning, c is the value associated with the key
console (seen key c)
console eol
# unique chars are: adelnpy
#-------------------------------------------
var Int sum:=0
for (var Int i) 0 string:len-1
sum += s:i:number
console sum eol
# prints "1248" if string was "an apple a day"
#---------------------------------------------
|
var Str str := "This is a [dq]string[dq] with [lf] special [lb]characters[rb] in it" var Str quoted := string str # "This is a [lb]dq[rb]string[lb]dq[rb] with [lb]lf[rb] special [lb]lb[rb]characters[lb]rb[rb] in it" # # back to unquoted string (quoted -> str) quoted eparse str #--------------------------------------------- |
#
# quoted " ([lb][dq][rb]) are implictely dequoted when arising in a parsed string
#
var Str string := "XYZZY,[dq][dq],[dq]O'Reilly, Inc[dq],[dq]Wall, Larry[dq],[dq]a [lb]dq[rb]glug[lb]dq[rb] bit[dq], another [dq]glub[dq] bit, 5, [dq]Error, Core Dumped[dq]"
var Str a
var Str b:=string+","
var Array:Str fields
while b<>""
if not (b parse a "," any:b) # if not a quoted string
b parse any:a "," any:b # it is not quoted and ends with the next ","
fields += a
for (var Int i) 0 fields:size-1
console "#" i ":" fields:i eol
#0 : XYZZY
#1 :
#2 : O'Reilly, Inc
#3 : Wall, Larry
#4 : a "glug" bit
#5 : another "glub" bit
#6 : 5
#7 : Error, Core Dumped
#-----------------------------
|