В каких случаях трудно различить код и данные?
Говорят, что код - это данные (и наоборот, то есть гомоичные) в Rebol и Red. Кроме того, сказано, что невозможно различить два. Насколько я понимаю, здесь есть 2 случая:
- Определить с уверенностью код из смеси кода и данных
- Определить с уверенностью данные из смеси кода и данных
смесь кода и данных - мое имя для того, что посторонние обычно называют кодом Rebol, и опытные программисты Rebol говорят, что это данные (кода нет, только данные)
мотивация
Различие кода и данных облегчает некоторые функции в языках программирования. Например, разборка была упомянута (sbcl имеет disassemble
функция).
Вопрос
Каковы примеры этих проблемных случаев?
контекст:
из чата 15 марта 2017 года 15:32: (выделение мое)
Дидек: Вы забываете, что в Redbol нет кода, только данные.
Maximvl: ну, для CL это одно и то же, и SBCL выполняет все, вплоть до собственного кода, и поскольку code = data, можно сказать, что данных нет, только код
Это не то же самое в языках Lisp, есть различие между "кодом" и "данными" [в Lisp], так как код должен начинаться с вызова. Redbol не имеет такого ограничения на код, что делает его совсем другим.
также:
Более того, контексты и динамическое связывание делают его более гибким, но в то же время прямой перевод на ассемблерный код низкого уровня, как в вашем примере CL, невозможен.
В сторону: Значит ли это, что Rebol более гомоичен, чем Lisp?
1 ответ
Вот один из них:
[q]
Аутсайдеры распознают функцию Q и увидят это как кодовый блок, в то время как инсайдеры Rebol будут знать, что это должны быть данные, потому что Q вызывается только с верхнего уровня интерпретатора.