В схеме вы можете определить функции, которые возвращают лямбда-выражение, и использовать их для определения новых функций. Например, вы можете написать этот код
(define (pow-iter base exp r)
(if (= exp 1)
r
(pow-iter base (- exp 1) (* base r))))
(define (pow exp)
(lambda (base)
(pow-iter base exp base)))
(define cubic (pow 3))
(cubic 2)
Здесь у нас есть функция pow
, которая принимает показатель степени в качестве аргумента и вычисляет лямбда-функцию, которая оценивается в n-й степени данного основания.
Однако, если мы поместим это в рамки, подобные этой:
(define (do-cubic x)
(define (pow-iter base exp r)
(if (= exp 1)
r
(pow-iter base (- exp 1) (* base r))))
(define (pow exp)
(lambda (base)
(pow-iter base exp base)))
(define cubic (pow 3))
(cubic x))
(do-cubic 2)
я получаю сообщение об ошибке
мощность: не определено; нельзя использовать до инициализации
Почему возникает эта ошибка и можно ли ее исправить, не меняя логику работы программы?
#!racket
. В#!r5rs
даже под RacketVM должен глючить. Это разные языки. - person Sylwester   schedule 20.07.2016