Схема стенография define/lambda

В Схеме, как я могу использовать определить/лямбда сокращение от вложенных лямбда-выражений в моем определять?

Например, учитывая следующую процедуру...

(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)
6
задан Brian Tompsett - 汤莱恩 27 November 2015 в 16:42
поделиться

3 ответа

(define (makeOperator operator)
  (lambda (num1 num2)
    (operator num1 num2)))

Вторая лямбда не может быть сокращена.

Ну, вы могли бы сократить ее до (define (makeOperator operator) operator), если вы не хотите принудительно гарантировать, что возвращаемая функция принимает ровно два аргумента.

12
ответ дан 8 December 2019 в 05:20
поделиться

В отличие от ответа выше, вторая лямбда может использовать сокращенную define нотацию:

(define (makeOperator operator)
  (define (foo num1 num2)
    (operator num1 num2))
  foo)
4
ответ дан 8 December 2019 в 05:20
поделиться

Некоторые реализации Scheme - такие, как Guile (проверена в версии 1.8) и MIT Scheme - предоставляют следующую сокращенную нотацию:

(define ((foo x) y) (+ x y))

(foo 5)
; => procedure
((foo 5) 3)
; => 8

Я полагаю, что эта нотация используется довольно часто в Структура и интерпретация классической механики.

7
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: