Почему Io REPL и интерпретатор дают мне два разных значения?
Рассмотрим этот код:
OperatorTable addOperator(":", 2)
: := method(value,
list(self, value)
)
hash := "key": "value"
hash println
Возвращение должно быть list(key, value)
и при использовании этого в Io REPL это именно возвращаемое значение. При использовании переводчика (как в io somefile.io
) возвращаемое значение value
, После некоторой проверки разница здесь:
# In the REPL
OperatorTable addOperator(":", 2)
message("k" : "v") # => "k" :("v")
# Via the Interpreter
OperatorTable addOperator(":", 2)
message("k" : "v") # => "k" : "v"
Почему это происходит?
2 ответа
Выполнение файла происходит на следующих этапах:
- загрузить файл
- заменить операторы на основе текущей таблицы операторов
- выполнить содержимое
Таким образом, преобразование оператора в сообщение происходит только тогда, когда файл изначально загружен на этапе 2. Когда код регистрации оператора выполняется на этапе 3. Это уже произошло, поэтому оператор не имеет никакого эффекта.
Вы можете установить порядок загрузки файлов вручную и поместить определение оператора в первый загруженный файл. Наличие файла под названием operators.io
например, который включает в себя все определения операторов, загруженные перед файлами, которые их используют.
После подтверждения галочкой я пришел к следующему решению:
main.io:
doFile("ops.io")
doFile("script.io")
ops.io:
OperatorTable addOperator(":", 2)
: := method(value,
list(self, value))
script.io:
hash := "key": "value"
hash println
Как объясняет тиканье, весь файл загружается сразу, поэтому вам нужно разделить его, чтобы порядок загрузки гарантировал доступность операторов.