Динамическое изменение литерала в схеме
Я хочу написать метод, который принимает литерал, скажем,
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