方案中的管道函数

问题描述 投票:0回答:1

我对方案充满热情,但我缺少一种“快速输入且易于阅读”的方式(没有括号)来创建“管道”,就像在 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# 中?

scheme
1个回答
0
投票

我现在已经用管道运算符(“~”)制定了解决方案:

(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

如有任何改进建议,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.