История изменений
Исправление monk, (текущая версия) :
А зачем она там нужна? В скиме от неё много пользы?
Да. Нет проблем с возможными коллизиями имён в том месте, где макрос определяется и в том, где он используется.
Абсолютно не читаемый бред получается
Тебе
(define-syntax my-or
(syntax-rules ()
((my-or) nil)
((my-or arg1) arg1)
((my-or arg1 args ...) (let ((temp arg1))
(if temp
temp
(my-or args ...))))))
(defmacro my-or (&rest args)
(cond
((null args) nil)
((null (cdr args)) (car args))
(t (let ((temp (gensym)))
`(let ((,temp ,(car args)))
(if ,temp
,temp
(my-or ,@(cdr args))))))))
и в 90% случаев даже macroepand не нужен что бы понять что к чему
Я макросы Racket практически в 100% случаев читаю не прибегая к expand.
Это весьма забавна, кстати, что поклонники Ракетки считают достоинством оной возможность писать ДСЛи без с-выражений.
Поклонники Ракетки считают достоинством наличие любой возможности. Если она не нужна, не используй, но если она нужна, то лучше когда она есть. Поэтому в Ракетке в отличие от CL есть финализаторы (которые выполняются перед удаление объекта), эфемероны, call/cc, call-with-escape-comntinuation, call-with-composable-continuation, call-with-continuation-barrier, security guard, inspector, custodian, impersonator, chaperon, typed racket и модули.
Исходная версия monk, :
А зачем она там нужна? В скиме от неё много пользы?
Да. Нет проблем с возможными коллизиями имён в том месте, где макрос определяется и в том, где он используется.
Абсолютно не читаемый бред получается
Тебе
(define-syntax my-or
(syntax-rules ()
((my-or) nil)
((my-or arg1) arg1)
((my-or arg1 args ...) (let ((temp arg1))
(if temp
temp
(my-or args ...))))))
(defmacro my-or (&rest args)
(cond
((null args) nil)
((null (cdr args)) (car args))
(t (let ((temp (gensym)))
`(let ((,temp ,(car args)))
(if temp
temp
(my-or ,@(cdr args))))))))
и в 90% случаев даже macroepand не нужен что бы понять что к чему
Я макросы Racket практически в 100% случаев читаю не прибегая к expand.
Это весьма забавна, кстати, что поклонники Ракетки считают достоинством оной возможность писать ДСЛи без с-выражений.
Поклонники Ракетки считают достоинством наличие любой возможности. Если она не нужна, не используй, но если она нужна, то лучше когда она есть. Поэтому в Ракетке в отличие от CL есть финализаторы (которые выполняются перед удаление объекта), эфемероны, call/cc, call-with-escape-comntinuation, call-with-composable-continuation, call-with-continuation-barrier, security guard, inspector, custodian, impersonator, chaperon, typed racket и модули.