Как передать независимые от положения параметры для функций схемы?Позиция независимых параметров для функций схемы
2
A
ответ
2
В PLT Scheme вы можете использовать:
(define area
(lambda (x #:width y)
(* x y)))
(area 3 #:width 10)
или
(area #:width 10 3)
как вернутся 30.
0
Я не схематор, но я думаю, что параметры должны быть парой, а не атомом, тогда вы делаете список параметров из своих пар и используете блок let для привязки значений к фактическим параметрам. И для любви ко всему, что красиво, вызовите вспомогательную функцию, чтобы выполнить фактическую работу с параметрами в правильном порядке, так как вызов get-param в рекурсии будет дорогим.
(define get-param (lambda (name pair-list)
(cond ((null? pair-list) nil)
((eq? name (caar pair-list)) (cadr (car pair-list)))
(t (get-param name (cdr pair-list))))))
; position independent subtract always subtracts y from x
; usage (f '(x 7) '(y 9)) => -2
; (f '(y 9) '(x 7)) => -2
(define f (lambda (x-pair y-pair)
(let ((pl (list x-pair y-pair))
(let ((x (get-param 'x pl)) (y (get-param 'y pl))
(- x y)))))
Кто-то, кто действительно умный сделает фабричную функцию, которая будет принимать произвольное лямбда-выражение и построить эквивалентное положение независимого лямбда от него.
1
Там нет поддержки стандарта для этого в схеме, но взглянуть на this
Есть ли способ изменить это? Я знаю, что мои именованные параметры такие же, как и используемые. (define (foo #: a a: b b #: c c) (+ a c)) (foo #: a 1 #: b 0 #: c 10) – unj2