LINUX.ORG.RU

Quote и lambda

 


1

1

А не задумывались ли вы, что quote и lambda по сути ничем не отличаются. Я тут сразу отбрасываю математический смысл, лексическую область и прочее, это непосредственно к лиспу отношения не имеет. Например

(define a (quote 1))
(define a (lambda() 1))

(eval a)
(a)
Тут одна и та же семантика. Просто задержка вычислений. Разница в том, что quote принимает только 1 аргумент. Я давно думал об этом, с помощью лямбд можно эмулировать поведение quote. В picolisp, собственно, и нет разницы, там lambda вообще выкинута. Понятное дело, что сейчас, в связи с модой на ФП, с лямбдой связывают кучу всяких заклинаний. Но ведь вплоть до схемы этой всей ФП-лабуды в лиспах не было. Получается, что Маккарти ввел лишнюю сущность в язык. Этот вопрос где нибудь обсуждается? Кто-нибудь видел какие-нибудь бумаги? Может быть, это было простой ошибкой дизайна, которую не успели выпилить и она исторически прижилась?


опять...

quote и lambda по сути ничем не отличаются

щас.

arkhnchul ★★
()

Я бы не сказал так. На мой вкгляд:

quote - это команда компилятору: Не трогай этот AST, он мне ещё понадобится.

lambda - это создание новой функции в которой раскроются макросы. Да и вообще её можно компилировать в машкод или байткод.

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

Да, но ведь в 60-е лиспы были интерпретируемыми. И раскрытия макросов, в обычном смысле, в компил тайме тогда не было.

phill
() автор топика

Прими свой ник. Пару штук. И пойми, что в лиспе всё едино: программа, данные, аргументы функций, сами функции...

ziemin ★★
()

Опять ты.

А не задумывались ли вы, что quote и lambda по сути ничем не отличаются.

(quote a)

Давай, изобрази мне тоже самое с лямбдой.

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

Я наверное тупой, но я ни слова не понял:)

в лиспе всё едино: программа, данные, аргументы функций, сами функции...

Это справедлимво далеко не для всех лиспов

phill
() автор топика
Ответ на: комментарий от ziemin

Вы тогда конкретизируйте, что это означает. Любая скомпилированная ф-ция недоступна в виде кода. Даже в жабаскрипте с этим дела гораздо лучше обстоят. Если есть сомнения, я приведу конкретный пример, где будет понятно, что не доступно в лиспе никакое АСТ, это все сказки. Только для препроцессора.

phill
() автор топика

define «семантика»

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

Кстати, ты прав, это работает. Сыпет варгингами, но работает.

mix_mix ★★★★★
()

(eval a)

Проблема тут. При связывании с А quote уже была вычислена и раскрыта в 1. Зачем это выполнять? Если заквотить символ или список, в твоем примере вообще получится ерунда.

Quote отдаленно можно рассматривать как синтаксический сахар над функциями создания символа, списка и т.д., но строго говоря это не так. Если в функции задана quote, то при каждом вызове этой функции quote в ее теле возвращает (или раскрывается во время компиляции, кому как нравится) один и тот же объект, не путать со значением.

Как все это увязать с лямбдой?

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

При связывании с А quote уже была вычислена и раскрыта в 1

Семантически нет, не была. Это сахар, просто 1 вычисляется в 1 сколько не вычисляй. Фактически же заквоченный символ вычисляется в сам символ. Тут еще надо учитывать, что вычисления энергичные. Например

(define a (quote b))
a; b
(eval a); error undefined
когда печатаешь a, в репле она эвалиться в чистый символ b. Когда пишешь (eval a) у тебя сначала а вычисляется в b подается в репл, а в репле еще раз эвалиться, и выскакивает ошибка, потому что b не связано ни с каким значением

phill
() автор топика
Ответ на: комментарий от staseg

Quote отдаленно можно рассматривать как синтаксический сахар над функциями создания символа, списка и т.д

Нет, символы и списки уже есть по-дефолту, в quote ничего не создается, просто не вычисляется, примерно как в шелле или тикле.

phill
() автор топика
Ответ на: комментарий от staseg

Если в функции задана quote

Не важно, где она задана, в функции или нет. Она везде делает то же самое, задерживает вычисление.

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

Семантически нет, не была.

Нет, была. И затем ты 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 и возвращает ее аргумент в качестве значения.

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

Нет, была

В этом смысле да, была. Но это противоречие, потому что если убрать константы, разница будет, я показал. Лисп сделан так, что там вообще нельзя получить символ просто так. Если ты что-то печатаешь, ты сразу получаешь значение. Ты как раз получаешь символ, если его квотируешь. А с 1 — это плохой пример, там не видно порядка вычислений.

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

Ты противоречишь сам себе. То что там «может быть» не будет выполняться, не значит что не будет выполняться.

необходимости заметно усложнять интерпретатор 60-х годов

Производительность тут не просядет, так как меньше динамических проверорок типов. А об усложнении семантики и вовсе смешно говорить, меньше сушностей, проще семантика.

phill
() автор топика
Ответ на: комментарий от staseg

сэмулировать:

На самом деле, в тех Ъ-лиспах лямбда выражения действительно(ТМ) были доступны в виде списка, поэтому там и эмулировать ничего не надо, и так все есть

(print (rest (lambda () 1 a 2)))
;(1 a 2)

phill
() автор топика
Ответ на: комментарий от staseg

Пример выше был на newlisp, а в picolisp вообще будет тупо

(set 'lambda quote)
(print (lambda 1 a 2)) # (1 a 2)
потому как там квот может принимать несколько аргументов, соответственно, лямбда вообще не нужна

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

Факториал можно вообще через while написать. В picolisp есть только quote, но он принимает более одного аргумента, через него, само-собой можно факториал написать. Для комбинатора нужен лексический скоп.

phill
() автор топика
Ответ на: комментарий от elyadow

Маккарти не вводил в язык лямбду, это схемачи гораздо позже сделали.

Че, серьёзно? Рекомендую ознакомиться с «LISP 1.5 Programmers Manual».

korvin_ ★★★★★
()

Ты больное. Выпей метанол.

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

Ок, раз ты такой наглый, расскажи нам, какой по LISP1.5 будет результат вычисления выражения (lambda () 1), например. Ссылки на страницы приветствуются.

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

Угребище, без quote не будет константных статических списков, все придется формировать динамически. Иди в жопу с такой эффективностью.

И ты еще за свой гнилой пердеж в теме про concurrency не ответило. Не соскакивай на новый бред.

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

Ты, хуесосина, читай тред, прежде чем пердеть своим еблом, тут за интерпретацию дяди разговаривают. Какие нахуй статические списки в lisp1.5. засунь их в очко себе для профилактики.

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

Но, все равно, там были оба ключевых слова, обе формы. Зачем тогда она вообще нужна, в каком бы то ни было виде? Маккарти ведь тоже разделял их, в том числе и по количеству принимаемых аргументов? Quote у него — это одноаргументная форма?

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

Упездок ты жалкий, статические константы совершенно перпендикулярны компиляции с интерпретацией. Интерпретатор такую константу распарсит сразу без исполнения.

А вообще интерпретаторы не нужны.

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

Ты противоречишь сам себе. То что там «может быть» не будет выполняться, не значит что не будет выполняться.

Есть большая разница. Вот у тебя eval (интерпретатор), он вычисляет список как исходный код. Затем в этом коде он находит quote и затем заквоченую часть списка начинает обрабатывать как данные.

Производительность тут не просядет, так как меньше динамических проверорок типов.

Чушь. Я пошагово расписал все дополнительные вычисления. К каждому из них можешь добавить еще и динамическую проверку типов. В то время как quote прост как топор.

А об усложнении семантики и вовсе смешно говорить, меньше сушностей, проще семантика.

Я написал «усложнение интерпретатора». Написал в контексте того, что, чтобы не просрать производительность, нужно наворачивать оптимизатор.

На самом деле, в тех Ъ-лиспах лямбда выражения действительно(ТМ) были доступны в виде списка, поэтому там и эмулировать ничего не надо, и так все есть

Не отменяет изъебств с лишними созданиями функций.

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

Слово было, а формы не было, не надо путать. Слово было нужно для красоты, использовалось как лексический маркер.

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

заквоченую часть списка начинает обрабатывать как данные

Ничего он там не обрабатывает. Он просто возвращает список как есть.

Я пошагово расписал все дополнительные вычисления.

Ты пошагово там расписал какие-то непонятные костыли, которые непонятно зачем нужны. Читай там ниже, как все делается.

нужно наворачивать оптимизатор.

Какой оптимизатор, ты за интерпретатор 60-х говорил.

Не отменяет изъебств с лишними созданиями функций.

Это ты о чем? какое создание?

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

Ничего он там не обрабатывает. Он просто возвращает список как есть.

Ну если eval-ить только quote, то да. Я рассматривал случай с большим списком, внутри которого есть quote.

Это ты о чем? какое создание?

Ну в newlisp по-моему не обходится без создания функции. Пример с пикой я вообще не понял, поэтому даже не прокомментировал.

Ты пошагово там расписал какие-то непонятные костыли, которые непонятно зачем нужны. Читай там ниже, как все делается.

Костыли для лиспов, не умеющих отдавать код лямбды (причем именно в том виде, в каком код был записан без малейших модификаций).

Какой оптимизатор, ты за интерпретатор 60-х говорил.

Ты можешь думать последовательно? Я предложил костыли, эмулирующие квотирование списка. Чтобы они эффективно работали, нужно уметь их оптимизировать, что усложняет интерпретатор 60-х годов.

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

Хуесос ты опущенный, какие нахуй статические константы, ты че вообще несешь, ламеришко ты жалкий. Что значит статические? Интерпретатор принимает на вход выражения и возвращает вычисленные значения. Иди там перед фапешниками там своей жопой верти, они там любят статические моноиды в вакуумных гуманоидах, а тут шлюхам не место, их сразу раскусывают тут и сливают в говно.

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

Я рассматривал случай с большим списком, внутри которого есть quote.

Я понял, я про него и говорю. Вообще, не совсем корректно говорить, что список вычисляется. Вычисление списка всегда означает применение функции к аргументам, иначе будет ошибка.

не умеющих отдавать код лямбды

В то время они все могли, ЕМНИП. Они не могут отдавать в схеме и CL из-за компиляции. Само по себе сокрытие особо смысла не имеет. Лисп, как раз, и славился представлением кода данными.

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

Ну ты пиздец уопрыш. Константа '(1 2 3) статическая, интерпретатор ее распарсил но не вычислил, а без quote тебе это придется динамически вычислять из (cons 1 (cons 2 (cons 3 nil)))

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

Чтобы они эффективно работали, нужно уметь их оптимизировать, что усложняет интерпретатор 60-х годов.

Не знаю, я особо не рублю в этом, но, насколько я знаю, основная просадка интерпретатора на динамической проверке, что там еще можно соптимизировать я хз

ЗЫ выше был я есличо.

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

Ты, говно упоротрое, про многопоточность отчитываться будешь, или уже тихо слил?

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

С какого хуя? (lambda() 1 2 3) тоже консами формируется?

динамически вычислять из (cons 1 (cons 2 (cons 3 nil)))

проспись ламерюга, то что ты написал, это не вычисления а создание. У тебя статика головного мозга. Антистатиком побрызгай в уши, чтоб мозг размагнитить, или, лучше, выдави из головы все гавно, как прыщь, а потом посмотри, не осталось ли там чего.

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

А ты, значит, лисп машины хорошо изучил? А теперь скажи, какое отношение имеет архитектура машины к реализации вычислителя?

Первым широко применяемым эффективно компилируемым лиспом был scheme.

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

В школу, сучка, уроки учить.

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

Это ты ебнутый на всю голову. Замыкания не во всех лиспах по дефолту лямбдой создаются.

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

Слово было, а формы не было, не надо путать. Слово было нужно для красоты, использовалось как лексический маркер.

Не просто для красоты, а особым образом обрабатывалось в apply (стр. 14).

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