[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-выражений?
Или проверить по стандарту, как отрабатывается макроподстановка.
---
...Я работаю антинаучным аферистом...
Есть подозрение, что макроподстановка не работает внутри quote и
quasiquote. Сможешь пропинать quote/quasiquote вглубь S-выражений?
Или проверить по стандарту, как отрабатывается макроподстановка.
---
...Я работаю антинаучным аферистом...
> (LET #:G177117 G (PRINT F) (PRINT (PRINT (1+ G
Мне почему-то думается, что ты имеешь в виду
(LET #:G177117 G (PRINT F) (PRINT (PRINT (1+ #:G177117
потому что
(c bb) -> (c (gensym -> (print (1+ (gensym
Оно?
---
...Я работаю антинаучным аферистом...
Мне почему-то думается, что ты имеешь в виду
(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.
Я думаю, что там надо чётко понимать порядок чтения и применения
макроподстановок, последнее надо найти в документации и
внимательно прочитать. Лично я ещё не понял, почему
Надо придумать, как сделать (или где взять) macroexpand на схеме.
---
...Я работаю антинаучным аферистом...
макроподстановок, последнее надо найти в документации и
внимательно прочитать. Лично я ещё не понял, почему
[6]> (macrolet this (x) (print x (macroexpand '(this x
(THIS X) ;
NIL
[9]> (macrolet this (x) (print x (this 'x
'X
X
Надо придумать, как сделать (или где взять) macroexpand на схеме.
---
...Я работаю антинаучным аферистом...
> (let bb (gensym
У меня есть предложение, которому ты не последуешь.
Чтобы не мучаться с gensym и всеми этими quasiquote,
использовал бы ты гигиеничные (hygienic) макросы.
Нет у тебя такого кода, где ими нельзя обойтись.
Location: http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html
---
...Я работаю антинаучным аферистом...
У меня есть предложение, которому ты не последуешь.
Чтобы не мучаться с gensym и всеми этими quasiquote,
использовал бы ты гигиеничные (hygienic) макросы.
Нет у тебя такого кода, где ими нельзя обойтись.
Location: http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html
---
...Я работаю антинаучным аферистом...
Во втором примере все логично. eval (this 'x) -> eval (print 'x) -> 'x is undefined.
Первый мне не понятен, может это macroexpand так и должен работать. Может там ' не нужна.
Первый мне не понятен, может это macroexpand так и должен работать. Может там ' не нужна.
> Первый мне не понятен, может это 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
У меня встречается сплошь и рядом.
Это не эквивалентные куски кода: в первом случае f1(a) запускается два раза и за счет сайд-эффектов результат может быть разным.
А вообще если что то встречается сплошь и рядом, то имеет смысл написать макрос, как завещал Пол Грэхэм
http://www.bookshelf.jp/texi/onlisp/onlisp_15.html#Anaphoric...
А вообще если что то встречается сплошь и рядом, то имеет смысл написать макрос, как завещал Пол Грэхэм
http://www.bookshelf.jp/texi/onlisp/onlisp_15.html#Anaphoric...
Это не эквивалентные куски кода: в первом случае f1(a) запускается два раза и за счет сайд-эффектов результат может быть разным.Мне это казалось очевидным.
А за ссылку спасибо.
Хотя и не нравится variable capture.
Насколько затратный по производительности let? По идее минимально должен быть.
Сам макрос в голову сразу приходит, другое дело насколько он оптимизируется, и как такое решается в других языках.
> А вообще если что то встречается сплошь и рядом,
> то имеет смысл написать макрос, как завещал Пол Грэхэм
Ты сможешь грамотно написать этот макрос?
Из разговора выше видно, что процедурные макросы писать очень
даже не просто. Особенно, когда сам не понимаешь, что хочешь.
Да, тех макросов, о которых говорит Грахам, может и не хватить.
---
...Я работаю антинаучным аферистом...
> то имеет смысл написать макрос, как завещал Пол Грэхэм
Ты сможешь грамотно написать этот макрос?
Из разговора выше видно, что процедурные макросы писать очень
даже не просто. Особенно, когда сам не понимаешь, что хочешь.
Да, тех макросов, о которых говорит Грахам, может и не хватить.
---
...Я работаю антинаучным аферистом...
> Насколько затратный по производительности let?
Тебе это проще замерить или спросить самому в c.l.l или где ещё.
> другое дело насколько он оптимизируется
Ты когда-нибудь видел, как пишут библиотеки на той же схеме, где
оптимизация хвостовой рекурсии является требованием стандарта?
Если обеспокоен производительностью, посмотри.
Попробуй порыться в библиотеках, наверняка там уже есть and-let*
или его аналог. Хотя чёрт их всех разберёт.
---
...Я работаю антинаучным аферистом...
Тебе это проще замерить или спросить самому в c.l.l или где ещё.
> другое дело насколько он оптимизируется
Ты когда-нибудь видел, как пишут библиотеки на той же схеме, где
оптимизация хвостовой рекурсии является требованием стандарта?
Если обеспокоен производительностью, посмотри.
Попробуй порыться в библиотеках, наверняка там уже есть and-let*
или его аналог. Хотя чёрт их всех разберёт.
---
...Я работаю антинаучным аферистом...
Ты сможешь грамотно написать этот макрос?Я писал такие макросы, что тебе и не снилось

и за счет сайд-эффектов результат может быть разнымА контра тут в соседнем треде сказал, что, если есть неоднозначности, то это - не Язык Программирования

А контра тут в соседнем треде сказал, что, если есть неоднозначности, то это - не Язык ПрограммированияЭто не однозначности - там 2 разных выражения. Если есть побочные эффекты от вызова функции - то эти выражения нельзя приравнивать. А если нет - то можно.
Если есть побочные эффекты от вызова функции - то эти выражения нельзя приравниватьИ чем это лучше C?
В C - тоже самое и во всех других языках тоже, только если у них не запрещены функции с побочными эффектами. И ничего в этом странного и неоднозначного нет.
А в том треде речь шла о том, что семантика языка C допускает получение неоднозначного результата - и там совсем другой случай.
А в том треде речь шла о том, что семантика языка 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
А хочется получить
Как?