Как я могу изменить код без помощи let, чтобы (gx) только что вычислялся один раз?
(define f (lambda (x) (i (g x) (h (g x)))))
Если let не разрешен, я бы использовал define внутри define:
define
(define f (lambda (x) (define y (g x)) (i y (h y))))
Однако, я предполагаю, что другой ответ - желаемый.Потому что он использует всемогущий lambda :).
lambda
Вы можете написать решение с помощью let, а затем преобразовать его, используя следующую эквивалентность между let и lambda:
let
(let ((name expression1)) expression2) == ((lambda (name) expression2) expression1)