Michal Kvasnička
Michal Kvasnička

Reputation: 73

read-from-string working in NetLogoWeb?

Is there any alternative to read-from-string that works in NetLogoWeb? I need to a string from an input field. The string contains some number of integers and should be converted to a list. Within NetLogo, I use this code:

to-report get-demand
  report reverse sort read-from-string ( word "[" the-field-name "]")
end

However, it seems that read-from-string is not implemented yet in NetLogoWeb. Any way around?

Many thanks and best wishes, Michal

P.S. Many thanks for developping NetLogoWeb. I really missed NetLogo plugins.

Upvotes: 2

Views: 148

Answers (4)

Jasper
Jasper

Reputation: 2790

Just to have an up-to-date answer here, as of October 2017, NetLogo Web does support read-from-string. A case like read-from-string (word "[" the-field-name "]") should work just as in desktop and report the list value.

Upvotes: 1

Seth Tisue
Seth Tisue

Reputation: 30508

I'd suggest:

to-report string-to-numbers [s]
  if empty? s [ report [] ]
  if first s = " " [ report string-to-numbers butfirst s ]
  let pos position " " s
  ifelse not is-number? pos
    [ report (list string-to-number s) ]
    [ report fput string-to-number substring s 0 pos
                  string-to-numbers substring s (pos + 1) length s ]
end

to-report string-to-number [s]
  report reduce [10 * ?1 + ?2]
                map [position ? "0123456789"]
                    explode s
end

to-report explode [s]
  report map [item ? s] n-values (length s) [?]
end

Sample run:

observer> show string-to-numbers "12 345 67"
observer: [12 345 67]

I verified that this works in both desktop NetLogo and NetLogo Web.

Upvotes: 1

Jason Bertsche
Jason Bertsche

Reputation: 125

Unfortunately, we haven't yet added support for read-from-string to NetLogo Web. It probably won't be there in the near future, either.

Is the code supplied here the real code that's giving you problems? I assume that it isn't, but, if it is, you can just do this for the same effect:

to-report get-demand report reverse sort (list the-field-name) end

(That is, if the-field-name is what it sounds like, which would be a string containing only the name of some "field".)

I assume that your real case is more complex. I might be able to offer a better workaround if I saw the true code. Are you sure that you can't solve your problem with tasks?

Upvotes: 2

Michal Kvasnička
Michal Kvasnička

Reputation: 73

Based on the previous answer (that the command will not be implemented soon), it seems the only solution is to implement a simple parser, i.e. something like this (works for integers separated by spaces):

to-report string-to-list [ s ]
let l []
let ss ""
let n 0
let mode "out"
repeat length s [
  set ss first s
  set s but-first s
  if ( ( ss = " ") and ( mode = "in" ) ) [
    set mode "out"
    set l lput n l
    set n 0
  ]
  if ( member? ss "0123456789") [ 
    set mode "in"
    set n ( n * 10 ) + ( position ss "0123456789" )
  ]
]
if ( mode = "in" ) [ set l lput n l ]
report l
end

The reporter gets a string s and returns a list of integers.

Or is there any simpler way to implement it?

Upvotes: 1

Related Questions