我对方案充满热情,但我缺少一种“快速输入且易于阅读”的方式(没有括号)来创建“管道”,就像在 F# 中一样。类似的东西
(pipe x
f1 y
f2 z1 z2
f3
...)
主要问题是函数(f1,f2,f3,...)可以有不同数量的参数。最好的解决方案可能是创建一个宏。但我还没有使用宏。到目前为止我最好的解决方案如下:
(define c ;currying a one parameter function
(lambda (x)
(lambda (f)
(lambda (y) (f y x)))))
(define cc ;currying a two parameter function
(lambda (x)
(lambda (f)
(lambda (y)
(lambda (z) (f y z x))))))
(define (pipe x . y)
(let loop ((x x) (y y))
(cond ((null? y) x)
((procedure? x) (loop (x (car y)) (cdr y)))
(else (loop ((car y) x) (cdr y))))))
;; Testing:
(pipe 10
cc + 1 22
c + 2
c * 10
) ; returns 350
如有任何改进建议,我将不胜感激。最好没有辅助功能“c”和“cc”。也许使用像“|”这样的管道运算符在 F# 中?
我现在已经用管道运算符(“~”)制定了解决方案:
(define (id x) x) (define ~ '~) (define (~? x) (eq? ~ x)) (define (pipe x . y) (let loop ((x (list x)) (y y) (f id)) (cond ((null? y) (apply f x)) ((~? (car y)) (loop (list (apply f x)) (cddr y) (cadr y))) (else (loop (cons (car y) x) (cdr y) f)))))
看起来效果不错。
使用示例:
(pipe 10
~ * 2
~ + 1 1 1 1
~ * 10
) ; => 240
如有任何改进建议,我将不胜感激。