LINUX.ORG.RU

Код как данные и гомоиконность

 


2

3

Закралось подозрение, что эти 2 термина, которые, зачастую употребляются как синонимы, означают, все же, разные вещи.

Концепцию code-as-data, может быть, следует понимать, как то, что код является first-class сущностью, его можно брать в качестве аргумента и возвращать в качестве значения. Таким свойством обладает, например Pico-lisp:


(set 'fu (quote(x) (let (local 1) (+ (eval x) (eval x)))))

(fu 'local) # 2

Например в схеме такой код невозможен, программы не могут манипулировать локальными символами. Также, функции в схеме не представлены списками, их невозможно пропарсить.

Может быть следовало бы разделить эти понятия, чтобы не плодить коней в вакууме? И вообще, был бы очень благодарен, если бы кто-нибудь дал четкое и прозрачное объяснение сабжевых терминов.


Ответ на: комментарий от monk

получишь пустой стек с двумя адресами на содержимое до команды

Ну а каков формат хранения стека? :) Какой тип данных для него?

anonymous
()
Ответ на: комментарий от monk

синтаксические проблемы несущественны.

Что значит несущественны, если гомоиконность - исключительно синтаксическое свойство? Только синтаксические проблемы и существенны же.

anonymous
()
Ответ на: комментарий от monk

Сможешь общий паттерн для этих АСТ сделать?

Почему он должен быть общий, если код разный?

Это аналогичная задача

Нет, не аналогичная. Смысл как раз в том и состоит, что в случае гомоиконности структурно одинаковый код порождает структурно одинаковое АСТ (т.к. код и есть АСТ). В негомоиконном ЯП это не обязательно будет выполняться, да и вообще стуктура АСТ может весьма сильно отличаться от структуры кода.

А если надо

Да речь не о том что надо, а о том, почему скала негомоиконна. Потому что можно писать негомоиконный код и он является вполне идеоматическим. На лиспе, кстати, тоже иногда можно писать негомоиконный код - кложура негомоиконна, например (тот же let).

anonymous
()
Ответ на: комментарий от anonymous

Что значит несущественны, если гомоиконность - исключительно синтаксическое свойство

Я в scala/nemerle могу прочитать/записать любой участок AST. То, что AST не выражается или плохо выражается синтаксисом основного языка ничуть не мешает этот AST преобразовывать

monk ★★★★★
()
Ответ на: комментарий от anonymous

То есть когда я сделал saveStack то у меня на стеке пустой массив и ноль, так?

Если стек был пустым, то да. (фактически, просто ноль)

Точнее на стеке указатель на то место, где ноль и массив

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Так давай без пусто/не пусто. Итак, в стандарте форта сказано, что если я напишу saveStack то на стеке будет 0 [], так? Четко и однозначно.

anonymous
()
Ответ на: комментарий от monk

Я в scala/nemerle могу прочитать/записать любой участок AST.

Можешь, по-этому code as data там есть. Но гомоиконности нет - по-этому парсинг и генерация АСТ сравнительно неудобна по сравнению с гомоиконными яп. Такие дела.

anonymous
()
Ответ на: комментарий от monk

Можешь дать ссылку на форт со спецификацией этой ф-и saveStack?

anonymous
()
Ответ на: комментарий от monk

Ну и да, еще немаловажный вопрос - а слова-то, собственно, как цитировать? Как мне положить на стек слово dup? не ф-ю dup, а само слово dup (разница как между + и '+ в лиспе)?

anonymous
()
Ответ на: комментарий от anonymous

в стандарте форта сказано, что если я напишу saveStack

В стандарте форта такого слова нет. Я его могу определить как запись в переменную Stack глубины стека и его содержимого (с очисткой стека). Поэтому если мне надо два стека сверху, то пишу не savestack dup, а savestack stack dup

monk ★★★★★
()
Ответ на: комментарий от anonymous

Можешь, по-этому code as data там есть. Но гомоиконности нет - по-этому парсинг и генерация АСТ сравнительно неудобна по сравнению с гомоиконными яп.

С этим утверждением я полностью согласен.

monk ★★★★★
()
Ответ на: комментарий от monk

В стандарте форта такого слова нет. Я его могу определить

Ну практически в любом языке _можно определить_ тип для представления АСТ (по крайней мере, если компилятор ЯП написан на самом ЯП). Но все-таки code as data должен предполагать именно наличие встроенных средств. И вопрос с цитированием остается еще. Будешь класть на стек строки с именами слов?

anonymous
()
Ответ на: комментарий от anonymous

Но все-таки code as data должен предполагать именно наличие встроенных средств

В forth очень слабое различие между встроенным и внешним. С другой стороны code as data для него не является основной функцией (ты же не будешь рассказывать, что лисп не ФП из-за того, что нет встроенных средств для каррирования, ленивости, монад и т.д.)

И вопрос с цитированием остается еще. Будешь класть на стек строки с именами слов?

Разумеется. Фактически макрос на форте — слово, которое читает следующие слова до ограничителя (ограничитель — специальное слово). Читает, естественно, на стек (больше некуда).

monk ★★★★★
()
Ответ на: комментарий от anonymous

определить как запись в переменную Stack

Это точно форт? -.-

А в чём проблема

create Stack  256 allot

: saveStack depth Stack ! depth Stack depth pop ! loop

за корректность saveStack не ручаюсь, мог слегка напутать.

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.