LINUX.ORG.RU

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

Исправление monk, (текущая версия) :

Как это не приходится, на ракете можно реализовать `unwind-protect` без изменения ядра компилятора?

Он называется dynamic-wind.

Ну так ты у себя это спрашивай, твои примеры были про гигиенические макросы и call/cc.

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

_использующие данную реализацию_

Тогда придётся либо использовать только функции из CL, либо писать что-то вроде

(defun (f-let-if f1 f2)
  (let ((temp (f1))
    (if temp temp (f2))))

(defmacro my-or (&rest args)
  (cond
    ((null args) nil)
    ((null (cdr args)) (car args))
    (t (let ((f-let-if #'f-let-if))
      `(funcall ,f-let-if 
                (lambda () ,(car args))
                (lambda () (my-or ,@(cdr args)))))))
Вот единственный вариант гарантировать, что переопределение символов из тела макроса не поломает макрос. Если раскрывается в другой макрос, то вообще придётся вручную макроэкспанд вызывать.

Исправление monk, :

Как это не приходится, на ракете можно реализовать `unwind-protect` без изменения ядра компилятора?

Он называется dynamic-wind.

Ну так ты у себя это спрашивай, твои примеры были про гигиенические макросы и call/cc.

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

_использующие данную реализацию_

Тогда придётся либо использовать только функции из CL, либо писать что-то вроде

(defun (f-let-if f1 f2)
  (let ((temp (f1))
    (if temp temp (f2))))

(defmacro my-or (&rest args)
  (cond
    ((null args) nil)
    ((null (cdr args)) (car args))
    (t (let ((f-let-if #'f-let-if))
      `(funcall ,f-let-if 
                (lambda () ,(car args))
                (lambda () (my-or @,(cdr args)))))))
Вот единственный вариант гарантировать, что переопределение символов из тела макроса не поломает макрос. Если раскрывается в другой макрос, то вообще придётся вручную макроэкспанд вызывать.

Исправление monk, :

Как это не приходится, на ракете можно реализовать `unwind-protect` без изменения ядра компилятора?

Он называется dynamic-wind.

Ну так ты у себя это спрашивай, твои примеры были про гигиенические макросы и call/cc.

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

_использующие данную реализацию_

Тогда придётся либо использовать только функции из CL, либо писать что-то вроде

(defun (f-let-if f1 f2)
  (let ((temp (f1))
    (if temp temp (f2))))

(defmacro my-or (&rest args)
  (cond
    ((null args) nil)
    ((null (cdr args)) (car args))
    (t (let ((f-let-if #'f-let-if))
      `(funcall ,f-let-if 
                (lambda () ,(car args))
                (lambda () (my-or @(cdr args)))))))
Вот единственный вариант гарантировать, что переопределение символов из тела макроса не поломает макрос. Если раскрывается в другой макрос, то вообще придётся вручную макроэкспанд вызывать.

Исходная версия monk, :

Как это не приходится, на ракете можно реализовать `unwind-protect` без изменения ядра компилятора?

Он называется dynamic-wind.

Ну так ты у себя это спрашивай, твои примеры были про гигиенические макросы и call/cc.

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

_использующие данную реализацию_

Тогда придётся либо использовать только функции из CL, либо писать что-то вроде

(defun (f-let-if f1 f2)
  (let ((temp (f1))
    (if temp temp (f2))))

(defmacro my-or (&rest args)
  (cond
    ((null args) nil)
    ((null (cdr args)) (car args))
    (t (let ((f-let-if #'f-let-if)
             (lambda #'lambda))
      `(f-let-if (,lambda () ,(car args))
                 (,lambda () (my-or @(cdr args)))))))
Вот единственный вариант гарантировать, что переопределение символов из тела макроса не поломает макрос. Если раскрывается в другой макрос, то вообще придётся вручную макроэкспанд вызывать.