LINUX.ORG.RU

Лисперы, что я делаю не так? - II


2

3

Я понял что я делал не так — я просто не использовал лисп.

Вощем, может кому полезно будет, человек пишет как дошел до жизни такой http://www.defmacro.org/ Честно говоря это мой уже не первый подход к снаряду. До этого раза поташнивало, сейчас думаю зашел. Действительно лисп оказался прост как грабли.

Без матов осознание того на сколько оно кульно описать тяжко.

Есть вопросы:

1) Кто-нибудь есть кто пользует vim, при этом пишет на лиспе?

2) Ясен хобот емакс мощнее, но как то оно не то. Есть кто пересел? Как ощущения вообще?

3) Practical Common Lisp ослилил. Что есть еще для просветления?

>Practical Common Lisp ослилил

On Lisp; Common Lisp The Language.

alg0rythm
()

>1) Кто-нибудь есть кто пользует vim, при этом пишет на лиспе?

Вроде Лавсан писал

3) Practical Common Lisp ослилил. Что есть еще для просветления?

CLTL, On Lisp, PAIP, AMOP.

yoghurt ★★★★★
()

Пиши программы.

mv ★★★★★
()

Кто-нибудь есть кто пользует vim, при этом пишет на лиспе?

Насколько я помню, Love5an как-то говорил что использует vim под виндой.

elverion
()

>Кто-нибудь есть кто пользует vim, при этом пишет на лиспе?

Пишу в kate

Ясен хобот емакс мощнее, но как то оно не то. Есть кто пересел? Как ощущения вообще?

Почитал встроенный мануал, начал какую-то огромную книгу по нему, но так и не срослось. Не осилил.

Practical Common Lisp ослилил. Что есть еще для просветления?

Просто начинай читать чужой код и решать свои задачи. Я PCL до конца не дочитал, мне не понравились тамошние примеры.

staseg ★★★★★
()

Кто-нибудь есть кто пользует vim, при этом пишет на лиспе?

Doug Hoyte, автор «Let over Lambda» использует nvi без подсветки. :)

Что есть еще для просветления?

On Lisp, Let over Lambda.

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

> Let over Lambda.

Вредная книжка, написанная совершенно безграмотным автором, который любит говорить о том, в чем не смыслит.

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

Вредная книжка, написанная совершенно безграмотным автором, который любит говорить о том, в чем не смыслит.

archimag, залогинься. Список претензий в студию.

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

> archimag, залогинься.

Спокойно, я никогда не пишу от anonymous. А мнение о вредности LOL для неокрепшего мозга как бы достаточно известно.

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

>> Practical Common Lisp ослилил. Что есть еще для просветления?

Real World Haskell, наверное.

Толсто, но, в общем, верно.

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

> Список претензий в студию.

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

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

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

А можно цитатку? А то я разрываюсь между:

Furthermore, recent research has shown that hygienic macro systems like those specified by various Scheme revisions can still be vulnerable to many interesting capture problems.

и

The wrong turn that Scheme took was to promote a domain specific language for the purpose of macro construction. While Scheme's mini-language is undeniably powerful, it misses the entire point of macros: macros are great because they are written in lisp, not some dumbed down pre-processor language.

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

А мнение о вредности LOL для неокрепшего мозга как бы достаточно известно.

Дык, надо мозг укреплять.

k_andy ★★★
()

Кто-нибудь есть кто пользует vim, при этом пишет на лиспе

Использую через limp.

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

Да повсюду: 1. смешивает схемовские syntax-rules с гигиеной - это ортогональные понятия

2. полагает, что гигиена - это такие «автоматические генсимы» - что есть в корне неверно, то есть определения гигиены из стандарта схемы он не читал, для чего она применяется - не знает

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

4. не понимает того простого факта, что негигиеническую макросистему вообще _нельзя_ использовать, потому что никто тебе не гарантирует, что используемые if/lambda в твоем макросе кто-нибудь не переопределит, после чего макрос сломается. Это верно вообще для любой ф-и/формы, используемой в макросе. И тут никакие генсимы не помогут. Пекеджи помогают, но плохо. Хотя проблема уже в том, что приходится системой пекеджей закрывать дырки макросистемы.

5. Ну и, конечно, куча общевосторгов, такое ощущение, что читаешь рекламный проспект: «только у нас, закажите блаблабла прямо сейчас и вы получите...»

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

> c гигиеной, гигиены, гигиенической

Зачем так много пунктов про гигиену? Просто скажите, что автор гигиены не осилил (может быть даже это и так). Ну да не бог весь какой грех. Книга то не про гигиену.

Хотя проблема уже в том, что приходится системой пекеджей

закрывать дырки макросистемы.



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

Ну да суть не в этом, а в том, что у вас «гигиена головного мозга».

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

Ну да не бог весь какой грех. Книга то не про гигиену.

Ну да, книга про макросы. А человек, который считает, что отсутствие гигиены - преимущество, не может что-то в макросах понимать. По определению.

Да пофиг на гигиену, но:

(defmacro! defunits% (quantity base-unit &rest units)
  `(defmacro ,(symb 'unit-of- quantity) (,g!val ,g!un)
     `(* ,,g!val
         ,(case ,g!un
           ((,base-unit) 1)
           ,@(mapcar (lambda (x)
                       `((,(car x)) ,(cadr x)))
                     (group units 2))))))
Ну реально, вот человека, который говорит «пишите такой код! это хороший, годный код!» можно назвать адекватным? Серьезно? `,,@`,`,@,``,

А совместное использование нескольких ортогональных средств для решения проблемы

Так тут не «совместное решение», тут один из аспектов языка порождает проблему (которую мог бы не порождать), и ее приходится неполноценно решать за счет другого аспекта. Это нормальное положение вещей? Серьезно?

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

Да повсюду: ...

Так цитаты будут? Или только огульные обвинения?

Автор в начале книги (стр 54-56) говорит: «гигиена — фуфло» (его право) и дальше о ней не заговаривает вообще.

5. Ну и, конечно, куча общевосторгов, такое ощущение, что читаешь рекламный проспект: «только у нас, закажите блаблабла прямо сейчас и вы получите...»

Butthurt Blub-фила? :)

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

Ну реально, вот человека, который говорит «пишите такой код! это хороший, годный код!» можно назвать адекватным? Серьезно? `,,@`,`,@,``,

Вот опять ложь. Автор не только не говорит: «пишите такой код! это хороший, годный код!», но и прямо под этим кодом говорит: «Defunits% uses a nested backquote—a construct notoriously difficult to understand.|»

Не надоело врать-то?

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

Ты же сам их и привел.

И как они «выдают полное незнание того, как работает эта самая гигиена и для чего она нужна»?

Это вы, батенька, о чем?

Таки книгу не читал. Это слово там чуть ли не на каждой странице. :)

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

> Это слово там чуть ли не на каждой странице. :)

Что-то я не припомню слова butthurt в открытых главах.

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

> Таки книгу не читал. Это слово там чуть ли не на каждой странице. :)

Я не понял смысл той фразы в контексте нашей беседы.

И как они «выдают полное незнание того, как работает эта самая гигиена и для чего она нужна»?

А, ну это в третьей главе, где он описывает проблему захвата переменных, упоминает гигиену, как средство ее решения, а потом говорит, что это все не торт и пишет про генсим, то есть незнание того, зачем нужна гигиена налицо. С незнанием того, как она работает, возможно, поторопился. Но мне сомнительно, что можно знать, как работает Х, не зная, для чего это Х нужно.

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

> прямо под этим кодом говорит: «Defunits% uses a nested backquote—a construct notoriously difficult to understand.|»

Ну так это ведь не противоречит тому, что он как раз своей книжкой и учит писать подобный код (иначе за чем он тогда приводить его в пример?). Вот если бы он написал, мол, реализация трудна для понимания, так писать не надо. Вот вам другая - хорошая, годная, в которой нету говнобекквотов и ручного петушения списков - это было бы понятно. Он же так не сделал, он альтернативной реализации не привел. То есть как оно выходит - код, конечно, write-only и с багами, но вы пишите, пишите. Общехардкор, анафорические макролиты, и все такое. Что до альтернативной реализации - вот как раз в твоей цитате он пишет, что высокоуровневые средства, конечно, есть (в схеме, например), но они не Ъ, потому что Ъ-лиспер пишет Ъ-макросы при помощи ручного петушения Ъ-списков с Ъ-бекквотами. И никак иначе.

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

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

[offtopic] Ну расскажи уже зачем эта гигиена нужна-то?! Просвети. [/offtopic]

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

Что до альтернативной реализации - вот как раз в твоей цитате он пишет, что высокоуровневые средства, конечно, есть (в схеме, например), но они не Ъ, потому что Ъ-лиспер пишет Ъ-макросы при помощи ручного петушения Ъ-списков с Ъ-бекквотами. И никак иначе.

По-твоему надо было переизобрести syntax-rules (или как их там?) в CL, и сделать на них?

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

Ну расскажи уже зачем эта гигиена нужна-то?! Просвети.

На примере:

> (define x 5)
> (define-syntax-rule (macro) (display x))
> (let ([x 10]) (macro))
5
> 
тут (define-syntax-rule (macro) (display x)) это то же самое, что и (defmacro macro () `(display ,x)). Проблему захвата переменных, конечно, гигиена решает в том числе, но это скорее вкусная добавка. Типа - не только ценный мех, но и...

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

> (defmacro macro () `(display ,x)) (defmacro macro () `(display x)) вот так

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

По-твоему надо было переизобрести syntax-rules (или как их там?) в CL, и сделать на них?

Или любой другой способ избавиться от бекквотной параши. Ну в самом деле, зачем писать так:

(defmacro! defunits% (quantity base-unit &rest units)
  `(defmacro ,(symb 'unit-of- quantity) (,g!val ,g!un)
     `(* ,,g!val
         ,(case ,g!un
           ((,base-unit) 1)
           ,@(mapcar (lambda (x)
                       `((,(car x)) ,(cadr x)))
                     (group units 2))))))
когда можно какнибудь так:
(define-simple-macro (defunits% quantity:id base-unit:id (~seq unit:id value) ...)
  #:with macro-name (datum->syntax #`quantity (format-symbol "unit-of-~a" #`quantity))
  (define-simple-macro (macro-name val un)
    (* val (case un
             [(base-unit) 1]
             [(unit) value] ...))))

anonymous
()

1) по поводу vim - для меня, как нуба, показался неплох slimv http://www.vim.org/scripts/script.php?script_id=2531 (использую только внешний REPL, куда из буфера по хоткей отпиравляется s-expression, REPL встроенный в vim отключил)

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

> что негигиеническую макросистему вообще _нельзя_ использовать, потому что никто тебе не гарантирует, что используемые if/lambda в твоем макросе кто-нибудь не переопределит, после чего макрос сломается.

Ага, так сразу и «нельзя». Ну-ну.

Это же прекрасно, что их можно переопределить, и тем самым поменять поведение всех макр. Для code instrumentation лучше ничего нет.

А жалкие трусишки, которые ссут от страха выстрелить себе в ногу, пусть дружно валят подальше от Лиспа, для них есть всякие там хацкели со скакалками.

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

> бекквотной параши

Пусть тебе не нравится синтаксис backquote, но не надо смешивать его с макросами, макросы отдельно, а backquote отдельно. В CL не вводят никаких специальных решений там, где можно обойтись комбинацией более общих. Макросы, backquote, пакеты - это всё ортогональные вещи, комбинируя которые можно добиться большей гибкости и мощности. Вводить на каждый чих специальное решение не есть хорошо.

когда можно какнибудь так


Ты действительно полагаешь, что это выглядит как-то лучше?

P.S. Где обещанная реализация iterate на няшных гигиенических макросах?

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

> Дык, если надо захватить x, то запятая нужна.

Дык вот и нужно без запятой. х не должен вычисляться во время раскрытия макроса, макрос должен раскрыться в этот х. И одновременно с этим - макрос должен замкнуться на х. Вот за тем, чтобы замыкать так макросы на контекст определения и нужна гигиена. Причем сэмулировать такой захват без гигиены нельзя принципиально, и всякие генсимы никак не помогут.

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

> Это же прекрасно, что их можно переопределить, и тем самым поменять поведение всех макр.

А зачем менять поведение макр совершенно непредсказуемым образом? Если макрос предполагает подобную «настройку» с переопределением то все нужные символы просто будут выведены из-под гигиены, так что все те же эффекты можно будет получить. Зато любой макрос будет работать всегда как надо, и все не сломается от того, что кто-то переопределит используемую в макросе форму. Полная свобода, не приходится трястись над каждой строчкой кода.

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

> Макросы, backquote, пакеты - это всё ортогональные вещи, комбинируя которые можно добиться большей гибкости и мощности.

Это ложь. Нельзя.

Пусть тебе не нравится синтаксис backquote, но не надо смешивать его с макросами, макросы отдельно, а backquote отдельно.

Конечно, не отдельно. Средства обработки АСТ (а раз в CL АСТ - это списки, то средства обработки списков) имеют совершенно прямое отношение к макросам.

В CL не вводят никаких специальных решений там, где можно обойтись комбинацией более общих.

Это ложь. Вот в схеме (какой-нибудь r5rs) не вводят никаких специальных решений там, где можно обойтись комбинацией общих. А в CL только тем и занимаются.

Ты действительно полагаешь, что это выглядит как-то лучше?

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

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

Вот в схеме (какой-нибудь r5rs) не вводят никаких специальных решений там, где можно обойтись комбинацией общих.

Не иметь в языке полиморфизма и ограничиваться букетами обычных функций (все эти string=?, char=?, =, eq?, equal?, eqv?; length, string-length, vector-length; и т.п.) - это не специальное решение вместо общего?

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

Надо: (defmacro macro () `(print x)), то есть х под кавычкой.

`(print x) ~> '(print x) ~> | (quote (a b)) == (list (quote a) (quote b)) | ~~> (list 'print 'x) ~> (cons 'print (cons 'x nil))

т.е. просто список квоченых сиволов, тогда как:

`(print ,x) ~> (list 'print x) ~> (cons 'print (cons x nil))

(своего рода «АСТ») x в данном случае замыкается. Можно обвернуть в gensym. Получается как с префиксом #' - семантика идентична, разница в паре значков, тут - разница в запятой. Всё таки, расскажи подробнее про гигиену в твоём понимании - в чём профит?

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

> Не иметь в языке полиморфизма и ограничиваться букетами обычных функций

Ну сделай себе одну с диспатчем в рантайме - кто мешает?

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

> т.е. просто список квоченых сиволов, тогда как:

Это все ясно, но суть-то в том, что замыкаться должен как раз заквоченный символ.

Всё таки, расскажи подробнее про гигиену в твоём понимании - в чём профит?

В том, что макрос всегда будет работать одинаково - вне зависимости от лексического окружения, в котором он был вызван (если только такая зависимость не закладывается самим разработчиком макроса), т.о. мы можем гарантировать его корректную работу. То есть по дефолту все символы, в которые раскрывается макрос, берутся из лексического окружения определения макроса, а не из окружения его вызова. И там все может быть гораздо веселее каких-то переопределенных лямбд. Dот есть у нас какой-то макрос macro, этот макрос? в свою очередь, раскрывается в aif, причем подставляем один из своих аргументов в ветку aif. Вопрос - что будет, если мы сами aif нигде не используем, определяем себе спокойно it, где-то юзаем, а потом передаем в macro? Ответ - плохо будет.

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

> ну да, инструментом надо уметь пользоваться.

А где в описанной ситуации неумение пользоваться инструментом? Человек писал макрос и использовал в нем aif, причем использовал вполне корректно. То есть aif (и другие анафорические макросы) нельзя использовать в других макросах, так? Какие еще ограничения есть?

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

>Человек писал макрос и использовал в нем aif, причем использовал вполне корректно.

aif написал сам? Взял из библиотеки? использовал только «внутри» или «выставил наружу» как результат работы своего макроса? Не предупредил, что использует aif и, соответственно, 'it «забит» (а что, нет aif с возможностью «загенсимить» it?)? Да, «полная динамика» накладывает свои ограничения. Не учитывать сей фактор - значит «не уметь пользоваться инструментом». А с «мне не удобно» прилюдно дрочить - извращение.

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

Берем библиотечный aif, дальше пишем

(defmacro macro (x) `(aif x it))

Теперь кто-то третий использует библиотеку с макросом macro, сам aif он не использует (или даже использует - например? как-то так (aif test (macro (print it)))). Следуя твоей логике тот, кто делал макрос macro обязан в доках указать на то, что где-то там в недрах его макроса используется aif (потому что вдруг)? То есть для того, чтобы пользоваться макросом, необходимо знать детали его реализации и результат макроэкспанда? Хороший, годный подход.

(а что, нет aif с возможностью «загенсимить» it?)?

То есть будем для каждого анафорического макроса делать по несколько версий - вот это aif с генсимом, это - без генсима, то - еще какой-нибудь хитрый вариант? А можно узнать - нафига это нужно? Почему нельзя сразу использовать систему, которая сама за тебя сделает все эти вещи и позволит использовать один единственный aif с гарантиями корректности? Зачем делать руками то, что может сделать компилятор? Я вот понимаю, если написать «в сишке можно напрямую работать с памятью, отсюда куча способов выстрелить себе в ногу», то можно ответить, что благодаря этой работе с памятью мы получаем дополнительые возможности, можем лучше контролировать производительность и т.п.. В случае же гигиены мы от ее отсутствия никакого профита не получаем - только искусственные ограничения и головную боль.

Да, «полная динамика» накладывает свои ограничения.

При чем тут «полная динамика»? Гигиена никак не связана ни с полной динамикой, ни с частичной динамикой, вообще ни с какой динамикой.

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

>кто делал макрос macro обязан в доках указать на то, что где-то там в недрах его макроса используется aif (потому что вдруг)

он должен указать, что его макро «объявляет и использует» символ 'it, дабы вложенный в его макросы код не переопределял его «по ошибке»

А можно узнать - нафига это нужно?


А вот это уже никоим хером не касается «правил использования инструмента». А то получается, что ты возмущаешься наличием 3-й педали в автомобиле с МКПП.

При чем тут «полная динамика»?


при том, что ты пытаешься гигиеной зафиксировать скоп, а возможность переопределить «всё и вся» в CL именуется «фичей», а не «багом», т.е. вопрос опять-же в «правильном использовании инструмента»

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