Newbie questions about Pliant

Newbie questions about Pliant

simple string-to-string mapping table

How can I use Dictionary type, to make it easy to work
with a hash table that maps strings keys to string values ?
Message posted by maybe Boris Reitman on 2004/10/11 02:45:22
I would like to have something like this,

var StringMap a

a "one" := "odin"
a "two" := "dva"
a "three" := "tri"
a "three" := "Tri"  # overwrites the previous value

I understand that with the Dictionary type I need to pass in allocated objects.
So, I need to do something like this,

var Dictionary a
var Link:Str tmp :> new Str
tmp := "odin"
a insert "one" addressof:tmp
# etc... 

Is this how I should be doing this, or is there a simpler way that I am missing ?
Should I be using another datatype and not Dictionary object ?

Thanks,
Boris
 

Message posted by maybe pom on 2004/10/11 05:11:16
Dictionary is low-lvel type. If you want a simple string to string conversion,
you should rather use (Dictionary Str Str) type:

gvar (Dictionary Str Str) dict
dict "a" := "b"
Message posted by maybe Boris Reitman on 2004/10/11 14:58:02
Hi,

Thanks, this is much simpler.  However,  I still need to precreate the
keys.  The example that you gave doesn't work as is, it needs,

gvar (Dictionary Str Str) dict
if not exists:(dict first "a") 
  dict insert "a" ""

dict "a" := "b"

it would be good to have an auto-create, so that precreating would not be needed.
Message posted by hubert.tonneau on 2004/10/11 21:26:02
I believe that your semantic for:
dict "a" := "b"
is the right one (insert the key if not existing instead of raising an error
as is does at the moment), but I have to carrefully check existing code
before switching, so it will append only when I have enough time to test.

Message posted by maybe Boris Reitman on 2004/10/12 05:19:15
Hi,

Why doesn't the following use of getkey work ? 

-----
module "/pliant/language/compiler.pli"

function main
  var (Dictionary Str Str) dict
  each value dict getkey k
    console "nothing" eol

main
-------

The compilation error follows.  If I remove the "getkey k" part it works.
I have Pliant version 91. Thanks.



Failed to compile each   ('value'  (Dictionary Str Str) rw  'getkey'  'k'  ?)
  compile file:t.pli (internals) 5 3
compile file:t.pli (internals) 4 1
compile file:t.pli (internals) 4 1
compile file:t.pli (internals) 3 1
compile file:t.pli (internals) 3 1
compile file:t.pli (internals) 3 1
compile file:t.pli (internals) 3 1
parse file:t.pli (internals) 8 1
module file:t.pli
----------------------------------------------------------------
actions stack is:
parse file:t.pli (internals) 8 1
module file:t.pli
----------------------------------------------------------------
processor stack content is:
error_notify_fatal (ErrorID Str) +14
error_report +61
error_renotify (ErrorID Address Str) +41
. compile (Expression) +125
  file:t.pli (internals) 3 1
parser_tag_record  /pliant/language/type/misc/tag.pli (internals) 182 1
. execute (ParserContext) +39
parser_filter_execute +240
pliant internal parse_one_token function (ParserContext) +391
compile_text (List Module) +230
pliant_load_module (Str Module Int Module) +920
??? at 134599684
----------------------------------------------------------------
Message posted by hubert.tonneau on 2004/10/12 07:35:24
There are two layers of set data types in Pliant:

layer 1:
Array
Dictionary
Index
Relation

layer 2:
List xxx
Dictionary xxx yyy
Index xxx

Layer 1 is defined in the C core of Pliant.
Layer 2 is defined in the /pliant/language/type/set/ modules.

The layer 1 is a kind a minimal implementation, used mainly by the Pliant
compiler itself.

The layer 2 is the set of data types applications should use.
At layer 2 level, you will not use 'getkey' in the each instruction,
but 'dict key value' as the way to get the key corresponding to 'value'
in 'dict' anywhere within the 'each' loop.
Message posted by maybe pom on 2004/10/12 08:05:58
About the dict "a" := "b" problem: you have a near writing which is

dict "a" "" := "b"

(dict "x" "y") means the element associated with key "x" if it exists,
otherwise a created one with default value "y".
Message posted by hubert.tonneau on 2004/10/12 08:07:37
> dict "a" "" := "b"

Seems like there is a high need for a Pliant book, so that I can read it.
Thanks Patrice.

Message posted by marcus on 2004/10/12 12:30:13
The Pliant book is slowly taking form here in my laptop. 

Most of the stuff will be copy-pasted-then-improved from the current 
documentation. But the smooth way to introduce the topics is the key point.

The book targets newbies, such as first year engineering students. Hence, since this 
dictionary function is sort of an advanced feature, it may be located in the last
chapters of the book, if there at all.

To prevent this fruitfull discussion of the usage of dictionary be lost in the 
annals of science, I need someone to tell me whether the current documentation
omitts, is incorrect, or is not clear on the issue discussed in this thread, so 
that I can then complement the current documentation for later addition to the 
book.

Regards to all.

Marcus
Message posted by hubert.tonneau on 2004/10/12 12:35:53
I would describe it the following wait:

The book talks only about layer 2 data types.

Then there is the chapter describing meta programming that will have a problem
since meta programming requires to deal with some of the layer 1 data type
used by the Pliant compiler engine, so there would be a note here describing
all the differences between the layer 1 data types and their layer 2 equivalents.
Message posted by maybe boris reitman on 2004/10/25 04:18:18
About lack of documentation.  There is documentation on how to use the layer 1
data sets based on addresses (Address datatype), but there is no documentation
on how to use the datasets comfortably.  It would be very usefull to have a sample
where the simplest and reccomended usage of the datasets is illustrated, with 
abstract datatypes. Por example, how do I work with a dictionary that maps X to Y
where X is arbitrary, and not Str or Int.  It seems that X needs to have an 
ordering (it needs a compare function to be defined for it), which means that,
if I understand correctly, if I can't define an ordering then I need to use 
addresses for the keys,

var (Dictionary Address Y) dict
var X x ; var Y y
dict insert addressof:x y

As well, the memory allocation issues need to be demonstrated.
I can help prepare the documentation as soon as I will understand all this.
Since the IRC channel idea doesn't take off, would people be interested in a
jabber based communication, and jabber conferences ?

Thanks,
Boris