[Lisp] Знаки препинания
[1]> (defmacro ab (a b)
(let bb (gensym
`(let bb ,b (print ,a) (print (print (1+ ,b
AB
[2]> (pprint (macroexpand-1 '(ab f g
(LET #:G2910 G (PRINT F) (PRINT (PRINT (1+ G
---
...Я работаю антинаучным аферистом...
Не знаю, что ты хочешьУгу. Хочу локальный макрос использовать при определении глобального.
Что-то типа того, только letted встречается раз 5 и в нем в or 10 условий. Я привожу тестовое-минимизированное.
(macrolet letted (first)
`(or
(= ,first 32)
(= ,first 73
(defmacro abc (runes-arg)
(let runes (gensym
(rune (gensym
`(let runes ,runes-arg
(some #'(lambda rune) letted rune ,runes
Вообще же, вы маньяки, такой головоломный код использовать,
наверняка там можно как-то всё упростить.
---
...Я работаю антинаучным аферистом...
Есть подозрение, что макроподстановка не работает внутри quote и
quasiquote. Сможешь пропинать quote/quasiquote вглубь S-выражений?
Или проверить по стандарту, как отрабатывается макроподстановка.
---
...Я работаю антинаучным аферистом...
Мне почему-то думается, что ты имеешь в виду
(LET #:G177117 G (PRINT F) (PRINT (PRINT (1+ #:G177117
потому что
(c bb) -> (c (gensym -> (print (1+ (gensym
[91]> (defmacro ab (a b)
(let bb (gensym
(flet c (d) `(print (1+ ,d
`(let bb ,b
(print ,a)
(print c bb
AB
[92]> (macroexpand '(ab f g
(LET #:G3083 G (PRINT F) (PRINT (PRINT (1+ #:G3083 ;
Оно?
---
...Я работаю антинаучным аферистом...
Есть подозрение, что макроподстановка не работает внутри quote иАргументы макроса не эвалуэйтятся (что логично поэтому macrolet и не работает. Надо код менять на вменяемый.
quasiquote.
макроподстановок, последнее надо найти в документации и
внимательно прочитать. Лично я ещё не понял, почему
[6]> (macrolet this (x) (print x (macroexpand '(this x
(THIS X) ;
NIL
[9]> (macrolet this (x) (print x (this 'x
'X
X
Надо придумать, как сделать (или где взять) macroexpand на схеме.
---
...Я работаю антинаучным аферистом...
У меня есть предложение, которому ты не последуешь.
Чтобы не мучаться с gensym и всеми этими quasiquote,
использовал бы ты гигиеничные (hygienic) макросы.
Нет у тебя такого кода, где ими нельзя обойтись.
Location: http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html
---
...Я работаю антинаучным аферистом...
Первый мне не понятен, может это macroexpand так и должен работать. Может там ' не нужна.
Мне очень не хочется читать стандарт.
> Может там ' не нужна.
[12]> (macrolet this (x) (print x (macroexpand (this 'x
'X
X ;
NIL
Верно.
---
...Я работаю...
Как красиво писать такое:
if f1(a):
f2(f1(a
else:
a
Что на Лиспе:
(let tmp f1(a
(if tmp f2(tmp) a
У меня встречается сплошь и рядом.
А вообще если что то встречается сплошь и рядом, то имеет смысл написать макрос, как завещал Пол Грэхэм
http://www.bookshelf.jp/texi/onlisp/onlisp_15.html#Anaphoric...
Это не эквивалентные куски кода: в первом случае f1(a) запускается два раза и за счет сайд-эффектов результат может быть разным.Мне это казалось очевидным.
А за ссылку спасибо.
Хотя и не нравится variable capture.
Насколько затратный по производительности let? По идее минимально должен быть.
Сам макрос в голову сразу приходит, другое дело насколько он оптимизируется, и как такое решается в других языках.
> то имеет смысл написать макрос, как завещал Пол Грэхэм
Ты сможешь грамотно написать этот макрос?
Из разговора выше видно, что процедурные макросы писать очень
даже не просто. Особенно, когда сам не понимаешь, что хочешь.
Да, тех макросов, о которых говорит Грахам, может и не хватить.
---
...Я работаю антинаучным аферистом...
Тебе это проще замерить или спросить самому в c.l.l или где ещё.
> другое дело насколько он оптимизируется
Ты когда-нибудь видел, как пишут библиотеки на той же схеме, где
оптимизация хвостовой рекурсии является требованием стандарта?
Если обеспокоен производительностью, посмотри.
Попробуй порыться в библиотеках, наверняка там уже есть and-let*
или его аналог. Хотя чёрт их всех разберёт.
---
...Я работаю антинаучным аферистом...
Ты сможешь грамотно написать этот макрос?Я писал такие макросы, что тебе и не снилось
и за счет сайд-эффектов результат может быть разнымА контра тут в соседнем треде сказал, что, если есть неоднозначности, то это - не Язык Программирования
А контра тут в соседнем треде сказал, что, если есть неоднозначности, то это - не Язык ПрограммированияЭто не однозначности - там 2 разных выражения. Если есть побочные эффекты от вызова функции - то эти выражения нельзя приравнивать. А если нет - то можно.
Если есть побочные эффекты от вызова функции - то эти выражения нельзя приравниватьИ чем это лучше C?
А в том треде речь шла о том, что семантика языка C допускает получение неоднозначного результата - и там совсем другой случай.
Тем, что такой стиль программирования не поощряется удобством записи.
---
...Я работаю антинаучным аферистом...
и там совсем другой случайЧем другой?
Чем другой?Ты придуриваешься что ли?
Видишь разницу:
1) ОДНО выражение: "++i + ++i" может давать разные значения в разных компиляторах.
2) ДВА РАЗНЫХ выражения: { b = f(a); if (b) g(b); else a; } и { if (f(a g(f(a; else a; }. Во 2-м функция f(a) может быть вызвана ДВА раза, хоть и с одним аргументом. И поэтому ЕСТЕСТВЕННО, что если функция f(a) имеет побочные эффекты, то значения выражений могут отличаться.
Блин.... не заметил про разные куски
Оставить комментарий
pilot
А хочется получить
Как?