Newbie questions about Pliant

Newbie questions about Pliant

passing ovar to a ui_function

I'd like to write ui_function that shows a certain form,
but inputs all data into into (ovar MyStructure data)
so I can access it later on.
Message posted by maybe Boris Reitman on 2008/07/02 17:00:03
This crashes.  How do I fix it up ?

----8<----

type FullName
  field Str firstname lastname

ui_function showform name
  arg Link:FullName name
  input "first name: " name:firstname ; eol
  input "last name: " name:lastname

ui_path "/sites/demo/test1"
  window main
    ovar FullName name
    showform name

---->8-------

Thanks,
Boris
Message posted by maybe Boris Reitman on 2008/07/05 12:53:55
I tried this, it doesn't work, but atlaest it doesn't crash. 
The value is not saved in name:firstname.
The adrress that is output is always the *same*, but it still doesn't work.

ui_type FullName
  field Str firstname lastname

ui_function showform name
  arg_rw Link:FullName name
  ovar Str x
  input "first name: " name:firstname ; eol
  #input "x: " x; eol
  button "show2"
    section_overwrite "output"
      text "Got2: name:firstname "+name:firstname ; eol


ui_path "/sites/demo/test1"
  window main
    ovar FullName name
    console "address1: " (cast addressof:(name:firstname) Int) eol
    showform name
    section "output"
      void
    button "show"
      section_overwrite "output"
        console "B address1: " (cast addressof:(name:firstname) Int) eol
        text "Got: "+name:firstname
Message posted by maybe Boris Reitman on 2008/07/06 12:22:11
I reduced it to the following problem:
---
ui_type FullName3
  field Str firstname lastname

ui_path "/sites/demo/test3"
  window main
    ovar FullName3 name
    input "firstname: " name:firstname
    section "output"
      void
    button "ok"
      section_overwrite "output"
        text "got: "+name:firstname
---

It doesn't work. name:firstname is empty string when "ok" button is 
pressed, no matter what.
Message posted by maybe Hubert Tonneau on 2008/07/07 10:34:05
The problem is that the input variable must be an object, not a field in an
object.
So, you would need something like:
  ui_type FullName3
    field Link:Str firstname lastname
so that 'firtname' and 'lastname' be real objects.
Message posted by maybe Boris Reitman on 2008/07/07 10:56:43
Thanks, that worked. This will do for now.

Why doesn't it work for fields ? va:variable in ui/server/instructions.pli stores 
memory address of thxe field. I have debugged it, and memory addresses match up.
What part am I missing?
Message posted by maybe Hubert Tonneau on 2008/07/07 11:15:04
I have, and I'll do, to write an article about memory management.

You can use a Link:xxx only if the target is an object.
The UI server uses such a link (it prevents the object to go away).

In very fiew words, an object is a data, that have two fields in front:
. one for references count
. one providing a pointer to the real type of the data (it is used to get
  the effective function when using object programming like generic functions)

So, if the data is not a real object, Pliant tries to access the two fields
in front, and since they don't exist, it just corrupts memory.
This is immediately catched at debugging level 2, but not at debugging level 1.
Message posted by maybe Boris Reitman on 2008/07/07 12:15:01
followup in talk forum
Message posted by maybe Boris Reitman on 2008/09/11 06:35:05
Don't get it, why doesn't this work:
--------
ui_path "/sites/demo/test2"
  window main
    ovar (Dictionary Str Link:Str) urls := var (Dictionary Str Link:Str) empty
    var Array:Str fields := var Array:Str empty_array
    fields += "facebook"
    fields += "myspace"
    fields += "livejournal"
    fields += "blogger"
    fields += "blog"
    fields += "blog"
    fields += "homepage"
    fields += "business"
    fields += "linkedin"
    fields += "msn"
    fields += "aim"
    fields += "icq"
    fields += "gtalk"
    fields += "jabber"
    fields += "phone"
    fields += "email"
    ovar Str dummy
    for (var Int i) 0 fields:size-1
      urls insert fields:i dummy
      urls fields:i :> new Str
      input "" urls:(fields:i)
    section "output"
      void
    button "ok"
      each url urls
        console url eol
        doc#section_tail "output"
          text (urls key url)+": "+url ; eol

--------
It crashes when I press ok button. Displays it fine.
Message posted by maybe Hubert Tonneau on 2008/09/11 10:27:43
'each' and 'key' implementations seem to be buggy when the datas in the
dictionary are some kind of pointers.
They are implemented in /pliant/language/type/set/each.pli and
/pliant/language/type/set/dictionary.pli
More precisely, some 'if real' are missing in
/pliant/language/type/set/dictionary.pli
for methods 'first' 'last' and 'key'

I'll fix that.
Message posted by maybe Hubert Tonneau on 2008/09/11 15:03:03
I've uploaded release 102d.
I'm not sure you want to use all of it because it's a bit disruptive,
but it contains a corrected /pliant/language/type/set/dictionary.pli module.

Anyway, it would be a very good idea to also extensively test release 102d
since it's fixing a lot of things (both small bugs and more fondamental design
flows) and will soon become release 103.

In release 102d we have:
. completely rewritten errors handling mechanism
. new unified TCP connections layer
Release 102d requires using the new executables in /pliant/binary/
Message posted by maybe Boris Reitman on 2008/09/11 16:07:03
Something is still wrong, with the exists check:

  for (var Int i) 0 fields:size-1
    console "got: field " fields:i eol
    var Str tmp := fields:i
    if not (urls exists tmp)
      urls insert fields:i dummy
    urls fields:i :> new Str

----------
got: field facebook
exception 11
----------------------------------------------------------------
actions stack is:
pml connection from 10.0.0.2
----------------------------------------------------------------
processor stack content is:
cast Argument ((Link Argument)) +2
. exists  /pliant/language/type/set/dictionary.pli (internals) 205 5 /pliant/language/type/set/dictionary.pli (internals) 207 12
. edit_profile  /sites/webnearby.com/index.ui (internals) 1631 1 /sites/webnearby.com/index.ui (internals) 1655 13
frozen expression at /sites/webnearby.com/index.ui (internals) 1805 1  /sites/webnearby.com/index.ui (internals) 1805 1 /sites/webnearby.com/index.ui (internals) 1807 13
pliant ui server instruction function  /pliant/graphic/ui/server/instructions.pli (internals) 214 1 /pliant/graphic/ui/server/instructions.pli (internals) 234 11
ui_service  /pliant/graphic/ui/server/main.pli (internals) 28 1 /pliant/graphic/ui/server/main.pli (internals) 69 5
answer_request  /pliant/util/pml/multiplexer.pli (internals) 63 1 /pliant/util/pml/multiplexer.pli (internals) 88 7
frozen expression at /pliant/util/pml/multiplexer.pli (internals) 133 1  /pliant/util/pml/multiplexer.pli (internals) 133 1 /pliant/util/pml/multiplexer.pli (internals) 135 46
----------------------------------------------------------------
Message posted by maybe Hubert Tonneau on 2008/09/11 16:21:59
What I don't know is why your code compiles:
  if not (urls exists tmp)
It should be:
  if not exists:(url first tmp)

Please notice that using (url tmp) is asserting that the key exists, so a crash
in case it does not is not a Pliant bug.
If you don't know if the key exists, just use (url first tmp)