Я хочу определить константу 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
использует пусть выражение, но я больше не могу использовать синтаксический сахар (define (f n) ...)
=>(define f (lambda (n) ...))
foo3
требует меньше изменений по сравнению с исходным, но каждый раз, когда я хочу это значение, я должен позвонить (foo3)
и сделать вычисление снова и снова.
Моих вопросов:
- Я думаю, что этот вид вложенного определения имеет смысл, но почему это считается ошибкой синтаксиса?
- Есть ли достойный способ написать определение
foo
?
Оба 'foo1' и' foo2 'эквивалентны (' let' использует 'lambda' под капотом). С другой стороны, 'foo3' определяет новую функцию, а не постоянное значение как другие параметры, поэтому она не эквивалентна. –
стандартный и правильный способ перезаписи вложенных 'define' (которые * являются * рекурсивными) с 'letrec':' (define foo (letrec ((bar (lambda (n) (+ nn)))) (bar 1))) '. , который эквивалентен (более популярному) * "named' let' "* construct,' (define foo (let bar ((n 1)) (+ nn))) '(даже если' bar' не называется рекурсивно здесь вообще). –
(определите foo1 ((lambda() (определите (бар n)) (+ n n)) (бар 1)))), это превысило скобки, удалите одну пару круглых скобок вокруг лямбда; подобный это (определить foo1 (лямбда() (определяем (bar n) (+ n n)) (балка 1))). Оно работает. – Alfgaar