Это может быть ошибка. Представьте, что у нас есть обычный путь:
(define/public (plus-one n) (+ 1 n))
Способ define
с именем и аргументами в скобках - это сахар для id
и lambda
, и он работает:
(define/public plus-one (lambda (n) (+ 1 n)))
Я получаю, что (curry + 1)
возвращает аналогичную лямбду и что этот объект должен работать, но это не так.
Весь смысл метода класса заключается в использовании закрытых полей объекта, и ни одно из них не делает этого, однако только версия curry
делает очевидным, что это не удастся, так как результирующая процедура выиграла ' не иметь сферу объекта.
Если вы представили, что мы использовали закрытую переменную для приращения, которое вы не могли бы использовать curry
, так как оно кеширует ее. например. Вы не можете повторить это:
(define increaser%
(class object%
(init inc)
(define increment inc)
(super-new)
(define/public (set-inc inc)
(set! increment inc))
(define/public (increase n)
(+ increment n))))
(define test (new increaser% [inc 2]))
(send test increase 1) ; ==> 3
(send test set-inc 3)
(send test increase 1) ; ==> 4
(define test2 (new increaser% [inc 21]))
(define value 13)
(map (lambda (obj) (send obj increase value)) (list test test2))
; ==> (16 34)