Этот вопрос аналогичен по возможности: In R6RS Scheme, is there a way to get the current environment for use with eval?, но я хотел бы сделать еще один шаг и спросить, как вы исправили бы что-то вроде этого.Использование переменных let в схеме лямбда в схеме
Моя проблема еще более смущена тем, что в моем случае '(+ x y)
является произвольным неоценимым заявлением лямбда. Неоценим, потому что он может содержать вызовы переменных, которые являются частью let (и поскольку Scheme не верит, что процедура будет вызвана в среде, содержащей эти переменные, когда текущий нет, он отключает неопределенную ошибку идентификатора) , Поэтому возникает вопрос: как я могу реструктурировать свой код, чтобы этот кошмар с прицелом больше не был проблемой? Я бы все еще мог использовать переменные окружения из let, когда вызывается лямбда.
Я использую Pretty Big
Цель состоит в том, чтобы создавать классы на схеме. Мой подход до сих пор является довольно большим (не каламбур), но выглядит следующим образом:
(define (dispatch msg methods args)
(if (null? methods) (display "Method signature not found.")
(let (
(m-name (caar methods))
(m-args (cadar methods))
(m-body (caddar methods)))
(if (and (eq? msg (caar methods)) (eq? (length args) (length (cadar methods))))
`(lambda ,m-args ,m-body)
(dispatch msg (cdr methods) args)))))
(define (build-lets c-def)
(let (
(i-vars (cadr c-def))
(meths (caddr c-def)))
(eval `(append ',i-vars (list (list 'methods '',meths))))))
(define (new c-def . args)
(apply (eval `(lambda ,(map cadr (cadr c-def))
(let* ,(build-lets c-def)
(lambda (msg . args)
(letrec ((meth (dispatch msg methods args)))
(apply meth args))))))
args))
где с четкостью является классом размораживание формы (скажем, для точки)
'(();Name of parent
((yvalue y) (xvalue x)) ;Instance variables: (i-var constructor-arg)
((getx() xvalue) ;Methods, ((name args body) ...)
(setx (x) (set! xvalue x)))))
Я не уверен, что вы пытаетесь сделать, у вас есть пример кода? –
@ ChrisJester-Young Я думаю, он хочет найти способ, чтобы что-то вроде '(let ((x 1)) (eval '(* x 2)))' будет возвращать '2'. –
@Maxwell это точно правильно – JPatnode