Схема определения / лямбда-сокращение - PullRequest
6 голосов
/ 31 мая 2010

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

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

(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)

Ответы [ 3 ]

12 голосов
/ 31 мая 2010
(define (makeOperator operator)
  (lambda (num1 num2)
    (operator num1 num2)))

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

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

7 голосов
/ 01 июня 2010

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

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

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

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

4 голосов
/ 31 мая 2010

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

(define (makeOperator operator)
  (define (foo num1 num2)
    (operator num1 num2))
  foo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...