А не задумывались ли вы, что quote и lambda по сути ничем не отличаются. Я тут сразу отбрасываю математический смысл, лексическую область и прочее, это непосредственно к лиспу отношения не имеет. Например
(define a (quote 1))
(define a (lambda() 1))
(eval a)
(a)
Тут одна и та же семантика. Просто задержка вычислений. Разница в том, что quote принимает только 1 аргумент. Я давно думал об этом, с помощью лямбд можно эмулировать поведение quote. В picolisp, собственно, и нет разницы, там lambda вообще выкинута. Понятное дело, что сейчас, в связи с модой на ФП, с лямбдой связывают кучу всяких заклинаний. Но ведь вплоть до схемы этой всей ФП-лабуды в лиспах не было. Получается, что Маккарти ввел лишнюю сущность в язык. Этот вопрос где нибудь обсуждается? Кто-нибудь видел какие-нибудь бумаги? Может быть, это было простой ошибкой дизайна, которую не успели выпилить и она исторически прижилась?
Вы тогда конкретизируйте, что это означает. Любая скомпилированная ф-ция недоступна в виде кода. Даже в жабаскрипте с этим дела гораздо лучше обстоят. Если есть сомнения, я приведу конкретный пример, где будет понятно, что не доступно в лиспе никакое АСТ, это все сказки. Только для препроцессора.
Проблема тут. При связывании с А quote уже была вычислена и раскрыта в 1. Зачем это выполнять? Если заквотить символ или список, в твоем примере вообще получится ерунда.
Quote отдаленно можно рассматривать как синтаксический сахар над функциями создания символа, списка и т.д., но строго говоря это не так. Если в функции задана quote, то при каждом вызове этой функции quote в ее теле возвращает (или раскрывается во время компиляции, кому как нравится) один и тот же объект, не путать со значением.
При связывании с А quote уже была вычислена и раскрыта в 1
Семантически нет, не была. Это сахар, просто 1 вычисляется в 1 сколько не вычисляй. Фактически же заквоченный символ вычисляется в сам символ. Тут еще надо учитывать, что вычисления энергичные. Например
(define a (quote b))
a; b
(eval a); error undefined
когда печатаешь a, в репле она эвалиться в чистый символ b. Когда пишешь (eval a) у тебя сначала а вычисляется в b подается в репл, а в репле еще раз эвалиться, и выскакивает ошибка, потому что b не связано ни с каким значением
Нет, была. И затем ты 1 еще раз вычислил в 1. И сам же ниже доказал это на квотировании символа.
Не важно, где она задана, в функции или нет. Она везде делает то же самое, задерживает вычисление.
Отчасти ты прав, quote пробрасывает кусок обрабатываемого AST в следующий уровень выполнения, но это не задержка вычисления, а его отмена, т.к. на следующем уровне этот кусок AST является просто данными, будут они как-то вычисляться или обрабатываться — не факт.
Возьмем (quote (1 a 2)). Его поведение конечно можно сэмулировать:
(define tmp (list 1 (make-symbol "a") 2))
(define q (lambda () tmp));я уж не стал использовать let, это привело бы к еще одному ветку лямбда-срача
Но это дикий гемморой для программиста, не говоря уж о необходимости заметно усложнять интерпретатор 60-х годов, чтобы не просрать в производительности на создании списка и функции, привязки их к переменным, вызове функции и нахождении значения переменных.
В случае спец формы все очень просто, интерпретатор встречает в AST quote и возвращает ее аргумент в качестве значения.
В этом смысле да, была. Но это противоречие, потому что если убрать константы, разница будет, я показал. Лисп сделан так, что там вообще нельзя получить символ просто так. Если ты что-то печатаешь, ты сразу получаешь значение. Ты как раз получаешь символ, если его квотируешь. А с 1 — это плохой пример, там не видно порядка вычислений.
но это не задержка вычисления, а его отмена
Ты противоречишь сам себе. То что там «может быть» не будет выполняться, не значит что не будет выполняться.
необходимости заметно усложнять интерпретатор 60-х годов
Производительность тут не просядет, так как меньше динамических проверорок типов. А об усложнении семантики и вовсе смешно говорить, меньше сушностей, проще семантика.
Факториал можно вообще через while написать. В picolisp есть только quote, но он принимает более одного аргумента, через него, само-собой можно факториал написать. Для комбинатора нужен лексический скоп.
Ок, раз ты такой наглый, расскажи нам, какой по LISP1.5 будет результат вычисления выражения (lambda () 1), например. Ссылки на страницы приветствуются.
Ты, хуесосина, читай тред, прежде чем пердеть своим еблом, тут за интерпретацию дяди разговаривают. Какие нахуй статические списки в lisp1.5. засунь их в очко себе для профилактики.
Но, все равно, там были оба ключевых слова, обе формы. Зачем тогда она вообще нужна, в каком бы то ни было виде? Маккарти ведь тоже разделял их, в том числе и по количеству принимаемых аргументов? Quote у него — это одноаргументная форма?
Упездок ты жалкий, статические константы совершенно перпендикулярны компиляции с интерпретацией. Интерпретатор такую константу распарсит сразу без исполнения.
Ты противоречишь сам себе. То что там «может быть» не будет выполняться, не значит что не будет выполняться.
Есть большая разница. Вот у тебя eval (интерпретатор), он вычисляет список как исходный код. Затем в этом коде он находит quote и затем заквоченую часть списка начинает обрабатывать как данные.
Производительность тут не просядет, так как меньше динамических проверорок типов.
Чушь. Я пошагово расписал все дополнительные вычисления. К каждому из них можешь добавить еще и динамическую проверку типов. В то время как quote прост как топор.
А об усложнении семантики и вовсе смешно говорить, меньше сушностей, проще семантика.
Я написал «усложнение интерпретатора». Написал в контексте того, что, чтобы не просрать производительность, нужно наворачивать оптимизатор.
На самом деле, в тех Ъ-лиспах лямбда выражения действительно(ТМ) были доступны в виде списка, поэтому там и эмулировать ничего не надо, и так все есть
Не отменяет изъебств с лишними созданиями функций.
Ничего он там не обрабатывает. Он просто возвращает список как есть.
Ну если eval-ить только quote, то да. Я рассматривал случай с большим списком, внутри которого есть quote.
Это ты о чем? какое создание?
Ну в newlisp по-моему не обходится без создания функции. Пример с пикой я вообще не понял, поэтому даже не прокомментировал.
Ты пошагово там расписал какие-то непонятные костыли, которые непонятно зачем нужны. Читай там ниже, как все делается.
Костыли для лиспов, не умеющих отдавать код лямбды (причем именно в том виде, в каком код был записан без малейших модификаций).
Какой оптимизатор, ты за интерпретатор 60-х говорил.
Ты можешь думать последовательно? Я предложил костыли, эмулирующие квотирование списка. Чтобы они эффективно работали, нужно уметь их оптимизировать, что усложняет интерпретатор 60-х годов.
Хуесос ты опущенный, какие нахуй статические константы, ты че вообще несешь, ламеришко ты жалкий. Что значит статические? Интерпретатор принимает на вход выражения и возвращает вычисленные значения. Иди там перед фапешниками там своей жопой верти, они там любят статические моноиды в вакуумных гуманоидах, а тут шлюхам не место, их сразу раскусывают тут и сливают в говно.
Я рассматривал случай с большим списком, внутри которого есть quote.
Я понял, я про него и говорю. Вообще, не совсем корректно говорить, что список вычисляется. Вычисление списка всегда означает применение функции к аргументам, иначе будет ошибка.
не умеющих отдавать код лямбды
В то время они все могли, ЕМНИП. Они не могут отдавать в схеме и CL из-за компиляции. Само по себе сокрытие особо смысла не имеет. Лисп, как раз, и славился представлением кода данными.
Ну ты пиздец уопрыш. Константа '(1 2 3) статическая, интерпретатор ее распарсил но не вычислил, а без quote тебе это придется динамически вычислять из (cons 1 (cons 2 (cons 3 nil)))
Чтобы они эффективно работали, нужно уметь их оптимизировать, что усложняет интерпретатор 60-х годов.
Не знаю, я особо не рублю в этом, но, насколько я знаю, основная просадка интерпретатора на динамической проверке, что там еще можно соптимизировать я хз
С какого хуя? (lambda() 1 2 3) тоже консами формируется?
динамически вычислять из (cons 1 (cons 2 (cons 3 nil)))
проспись ламерюга, то что ты написал, это не вычисления а создание. У тебя статика головного мозга. Антистатиком побрызгай в уши, чтоб мозг размагнитить, или, лучше, выдави из головы все гавно, как прыщь, а потом посмотри, не осталось ли там чего.