В каком смысле такие языки, как эликсир и джулия, гомоичны?

Гомиконичность в Лиспе легко увидеть:

(+ 1 2)

это как вызов функции + с 1, 2 в качестве аргументов, а также список, содержащий +, 1, а также 2, Это одновременно и код, и данные.

На языке, как Юлия, хотя:

1 + 2

Я знаю, что мы можем разобрать это в Expr у Юлии:

:(1 + 2)

И тогда мы можем получить AST и манипулировать им:

julia> Meta.show_sexpr(:(1+2)) (:call, :+, 1, 2)

Таким образом, мы можем манипулировать AST программы в Julia (и Elixir). Но действительно ли они гомоичны в том же смысле, что и Лисп - действительно ли какой-то фрагмент кода является просто структурой данных в самом языке?

Я не понимаю, как код 1 + 2 в Юлии, сразу же, как данные (+ 1 2) в Лиспе это просто список. Это все еще омиконик?

1 ответ

Решение

По словам Билла Клинтона, "это зависит от того, что означает слово" есть "". Ну, ладно, не совсем, но это зависит от того, что означает слово "гомоиконик". Этот термин является достаточно спорным, и мы больше не говорим, что Юлия гомоична - так что вы сами можете решить, подходит ли он. Вместо того, чтобы пытаться определить гомоконичность, я процитирую то, что сказал Кент Питман (который кое-что знает о Лиспе) в интервью Slashdot в 2001 году:

Мне нравится готовность Лиспа представлять себя. Люди часто объясняют это своей способностью представлять себя, но я думаю, что это неправильно. Большинство языков способны представлять себя, но у них просто нет желания. Программы на Лиспе представлены списками, и программисты знают об этом. Это не имеет значения, если бы это были массивы. Важно то, что представлена ​​структура программы, а не синтаксис символов, но помимо этого выбор довольно произвольный. Не важно, чтобы представление было правильным выбором. Просто важно, чтобы это был общий, согласованный выбор, чтобы существовало богатое сообщество программ, управляющих программами, которые "торгуют" в этом общем представлении.

Он также не определяет гомойконичность - он, вероятно, не хочет вступать в спор об определении больше, чем я. Но он затрагивает суть вопроса: насколько готов язык представлять себя? Лисп желает до крайности - вы даже не можете избежать этого: представление программы в виде данных просто сидит прямо там, глядя вам в лицо. Джулия не использует синтаксис S-выражений, поэтому представление кода в виде данных менее очевидно, но оно не очень скрыто:

julia> ex = :(2a + b + 1)
:(2a + b + 1)

julia> dump(ex)
Expr
  head: Symbol call
  args: Array(Any,(4,))
    1: Symbol +
    2: Expr
      head: Symbol call
      args: Array(Any,(3,))
        1: Symbol *
        2: Int64 2
        3: Symbol a
      typ: Any
    3: Symbol b
    4: Int64 1
  typ: Any

julia> Meta.show_sexpr(ex)
(:call, :+, (:call, :*, 2, :a), :b, 1)

julia> ex.args[3]
:b

julia> ex.args[3] = :(3b)
:(3b)

julia> ex
:(2a + 3b + 1)

Юлия код представлен Expr тип (и символы и атомы), и хотя соответствие между поверхностным синтаксисом и структурой менее очевидно, оно все же существует. И что более важно, люди знают, что код - это просто данные, которые можно генерировать и манипулировать, поэтому, как выразился KMP, существует "богатое сообщество программно-манипулирующих программ".

Это не просто поверхностное представление кода Julia как структуры данных - это то, как Julia представляет свой код самому себе. Когда вы вводите выражение в REPL, оно анализируется в Expr объекты. Те Expr объекты затем передаются evalчто "понижает" их до несколько более регулярных Expr объекты, которые затем передаются на вывод типа, все реализовано в Julia. Ключевым моментом является то, что компилятор использует точно такое же представление кода, которое вы видите. Ситуация в Лиспе не так уж отличается. Когда вы смотрите на код Lisp, вы на самом деле не видите список объектов - они существуют только в памяти компьютера. То, что вы видите, представляет собой текстовое представление литералов списков, которые интерпретатор Lisp анализирует и превращает в объекты списков, которые он затем извлекает, подобно Джулии. Синтаксис Юлии можно рассматривать как текстовое представление Expr литералы - Expr просто оказывается несколько менее общая структура данных, чем список.

Я не знаю деталей, но я подозреваю, что Эликсир похож - возможно, Хосе включится.

Смотрите также:

Другие вопросы по тегам