LINUX.ORG.RU

История изменений

Исправление 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 и модули.