Динамическое изменение литерала в схеме

Я хочу написать метод, который принимает литерал, скажем,

turn

конец возвращает что-то вроде этого

(my turn)

Итак, после этого, если я позвоню eval, схема вызовет определенный метод my с параметром turn,

Мне удалось просто вернуть какой-то другой литерал или строку, но мне не удалось сделать то, что я хотел. И я не нашел никакой спецификации о чем-то подобном.

Я предполагаю, что мне нужно как-то использовать что-то вроде этого: `(my,@param) но это не работает

turn это символ

1 ответ

Для меня это звучит как проблема XY, возможно, есть более простой способ достичь того, что вы действительно намерены делать... В любом случае, отвечая на вопрос:

; we need to prevent the evaluation of the parameter,
; a normal procedure won't work here - we need a macro
(define-syntax method
  (syntax-rules ()
    ((_ x) '(my x))))

; sample input
(define turn 9)
(define (my param) (+ 1 param))

; setup the evaluation namespace
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))

; first test: `method` returns a non-evaluated expression
(method turn)
=> '(my turn)

; second test: evaluate the returned expression
(eval (method turn) ns)
=> 10
Другие вопросы по тегам