В Схеме, как я могу использовать определить/лямбда сокращение от вложенных лямбда-выражений в моем определять?
Например, учитывая следующую процедуру...
(define add
(lambda (num1 num2)
(+ num1 num2)))
Можно сократить его к этому:
(define (add num1 num2)
(+ num1 num2))
Однако, как я могу сократить следующую функцию так же?
(define makeOperator
(lambda (operator)
(lambda (num1 num2)
(operator num1 num2))))
;example useage - equivalent to (* 3 4):
((makeOperator *) 3 4)
(define (makeOperator operator)
(lambda (num1 num2)
(operator num1 num2)))
Вторая лямбда не может быть сокращена.
Ну, вы могли бы сократить ее до (define (makeOperator operator) operator)
, если вы не хотите принудительно гарантировать, что возвращаемая функция принимает ровно два аргумента.
В отличие от ответа выше, вторая лямбда
может использовать сокращенную define
нотацию:
(define (makeOperator operator)
(define (foo num1 num2)
(operator num1 num2))
foo)
Некоторые реализации Scheme - такие, как Guile (проверена в версии 1.8) и MIT Scheme - предоставляют следующую сокращенную нотацию:
(define ((foo x) y) (+ x y))
(foo 5)
; => procedure
((foo 5) 3)
; => 8
Я полагаю, что эта нотация используется довольно часто в Структура и интерпретация классической механики.