Я хочу определить константу foo
с помощью вспомогательной функции, скажем, bar
. И я хочу скрыть bar
внутри определения foo
, поэтому я пришел с этим кодом:
(define foo
(define (bar n)
(+ n n))
(bar 1))
Однако это определение вызывает синтаксические ошибки во многих реализациях схем (мит-схема, рэкет, хитрость и т. д.).
У меня есть три обходных пути, но ни один из них не кажется удовлетворительным:
(define foo1
((lambda ()
(define (bar n)
(+ n n))
(bar 1))))
(define foo2
(let ((bar (lambda (n) (+ n n))))
(bar 1)))
(define (foo3)
(define (bar n)
(+ n n))
(bar 1))
foo1
использует лямбда для создания среды написания вспомогательных определений, а круглые скобки кажутся несколько запутанными.
foo2
использует выражение let, но я больше не могу использовать синтаксический сахар (define (f n) ...)
=> (define f (lambda (n) ...))
foo3
требует меньше изменений по сравнению с исходным, но каждый раз, когда мне нужно это значение, мне приходится вызывать (foo3)
и выполнять вычисления заново.
Мои вопросы:
- Я думаю, что такое вложенное определение имеет смысл, но почему оно считается синтаксической ошибкой?
- есть ли достойный способ написать определение
foo
?
foo1
, иfoo2
эквивалентны (let
используетlambda
под капотом). С другой стороны,foo3
определяет новую функцию, а не постоянное значение, как другие параметры, так что это не эквивалентно. - person Óscar López   schedule 03.01.2014define
(которые являются рекурсивными) - этоletrec
:(define foo (letrec ((bar (lambda(n) (+ n n)))) (bar 1)))
. что эквивалентно (более популярной) конструкции namedlet
,(define foo (let bar ((n 1)) (+ n n)))
(хотяbar
здесь вообще не вызывается рекурсивно). - person Will Ness   schedule 11.08.2015