Нет ни одного - и это особенность. eval
выполняет оценку формы, которая была сгенерирована динамически во время выполнения. Так что, если ему нужно знать о локальных привязках, вам нужно скомпилировать (lamba (x) x)
и (lambda (y) y)
по-разному - потому что имя имеет значение. Но это только подсказка, существует множество проблем, связанных с реализацией такого рода функций.
Что касается вашей проблемы - даже если можно было делать то, что вы хотите, это хрупкое решение, которое зависит от имени. Помните, что в Scheme вы можете использовать функции, как и любое другое значение - поэтому вместо вызова get-type
и объединения его с каким-либо символом для получения имени, сделайте ваши объекты содержащими нужную функцию (которую в этот момент лучше назвать "метод").
Что-то вроде:
(define (area object)
((get-area-method object) object))
Очевидно, что это означает, что нет смысла не проделывать весь путь с:
(define (area object)
(get-area object))
что просто
(define area get-area)
Но первая может быть более типичной для обычной ОО-подобной системы, с возможностью получения методов, поэтому она может быть полезна для вас. Это направление может привести вас к:
(define (area object)
((get-method object 'get-area) object))