Проблема с продвинутым кодом netlogo, включающим вопросительный знак - PullRequest
0 голосов
/ 02 июля 2018

Я использую Netlogo v6.0.4 и получаю следующее сообщение об ошибке, когда пытаюсь запустить пример кода из ответа, найденного здесь на переполнении стека.

Ничего не названо? был определен

В этом ответе предлагается следующий код netlogo:

to-report split [ string delim ]
  report reduce [
    ifelse-value (?2 = delim)
      [ lput "" ?1 ]
      [ lput word last ?1 ?2 but-last ?1 ]
  ] fput [""] n-values (length string) [ substring string ? (? + 1) ]
end

Определенный ?, который он делает, является первым в этом разделе substring string ? (? + 1).

Когда этот ответ был написан в 2014 году, Netlogo v5 активно использовался, и у него была функция под названием tasks, которая была лямбда-методом. Но в v6 задачи были заменены анонимными процедурами .

Это то, что ? здесь? Как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 02 июля 2018

Вы получили это в одном - ? в версиях были по существу заполнителями для любой переменной, передаваемой в задачу. В словарной записи 5.3 для foreach есть хороший пример:

foreach [1.1 2.2 2.6] [ show (word ? " -> " round ?) ]
=> 1.1 -> 1
=> 2.2 -> 2
=> 2.6 -> 3

В этом случае foreach брал входной список [1.1 2.2 2.6] и перебирал его, где ? занимает место в блоке команд текущего обрабатываемого элемента. Насколько я понимаю, основное синтаксическое отличие в 6.X состоит в том, что теперь вы явно указываете, что это за заполнитель, используя оператор ->. Итак, та же самая идея, что и выше, переведенная в 6.0 в примере foreach в словарной записи 6.0 , выглядит следующим образом:

foreach [1.1 2.2 2.6] [ x -> show (word x " -> " round x) ]
=> 1.1 -> 1
=> 2.2 -> 2
=> 2.6 -> 3

Там вы можете видеть, что x явно определяется как заполнитель. Это действительно улучшает ясность кода - вы можете определить местозаполнитель так, как вам хочется, чтобы он был настолько ясным и понятным, насколько вам бы хотелось, - этот (в верхней части) пример работает так же хорошо:

foreach [ 1.1 2.2 2.6 ] [ round_me -> show (word round_me " -> " round round_me) ]

Если вы используете несколько списков, обратите внимание, что вы должны окружить анонимную процедуру ( ), а объявление заполнителя [ ] - например:

( foreach [ 1 2 3 ] [ 10 20 30 ] [ [ a b ] -> print a * b ] )

Если вы переводите свой пример кода, тогда вы можете просто сосредоточиться на явном указании заполнителей. Это также может помочь разбить его на составные части для уточнения - более подробно в комментариях:

to-report split2 [ string delim ]
  ; split the string up into individual characters
  let characters fput [""] n-values ( length string ) [ a -> substring string a ( a + 1 ) ]

  ;  build words, cutting where the delimiter occurs
  let output reduce [ [ b c ] -> 
    ifelse-value ( c = delim ) 
    [ lput "" b ] 
    [ lput word last b c but-last b ]
  ] characters

  report output
end

Теперь, чтобы следовать примеру Николаса из вашего связанного ответа, вы можете назвать это to-report, чтобы разделить ваш текст:

to read-example
  let line "Example\tof\tsome\ttext"

  show split2 line "\t"
end

Дает вам:

observer: ["Example" "of" "some" "text"]

Надеюсь, это полезно!

...