Это не будет работать. eval
принимает окружение, и вы передаете его (current-module)
. Это привязки верхнего уровня в модуле, такие как test
, но не лексические привязки, такие как foo
или bar
. Они просто не существуют в среде, возвращаемой (current-module)
.
Вы можете сделать это:
(define foo "value of foo")
(eval '(format #t "~A~%" foo) (current-module))
; prints "value of foo"
; ==> #t
Кроме того, слон в комнате, что вы можете сделать это с лямбдами:
(define (test value proc)
(proc value))
(test "value to process" (lambda (foo) (format #t "~A~%" foo)))
; prints "value to process"
; ==> #t
В качестве альтернативы, но я ' Я предполагаю, что вы не можете иметь format
в обратном вызове, потому что «код-фрагмент» может иметь много разных значений:
(define (main)
(serialize-parameters #:code-snippet "~A~%"))
(define (callback some-default-parameters code-snippet)
(format #t code-snippet some-default-parameters))
РЕДАКТИРОВАТЬ
Я думаю, вы можете сделать это наполовину жестко:
(define (main)
(serialize-parameters #:code-snippet 'print-format))
(define (callback argument message)
(case message
((print-format) (format #t "~A~%" argument))
((other-message) (handle-message ...))
(else ...)))
Вы даже можете сделать это динамическим c диспетчером. Например. вы делаете что-то вроде этого:
(define messages '())
(define (register-callback message proc)
(set! messages (cons (cons message proc) messages)))
(define (callback argument message)
(let ((found (assq message messages)))
(when found
((cdr found) argument))))
(register-callback 'print-format (lambda (arg) (format #t "~A~%" arg)))
(callback "test" 'print-format) ; prints "test"
Теперь в файле сохраняется только сообщение, которое может быть любым литералом данных.