在球拍中管道

时间:2016-08-12 06:25:42

标签: scheme pipe racket

是否可以在Racket中使用一个功能输出到下一个。例如,可以重写以下代码:

(define (safestr sentstr)
   (list->string
    (remove*
     (list   #\| #\;  #\:  #\/ #\\ #\' #\")
     (string->list sentstr) )))

(define  (safestr sentstr)
  sentstr | 
  (string->list .) |
  (remove* (list #\: #\;) .) |
  (list->string .) )

“。”表示先前语句的输出。

这也显示了正常的流动方向和进度,而不是逆流。

用作创建语言的语言的球拍应该能够做到这一点。我在这里查了https://docs.racket-lang.org/reference/pipeports.html但是找不到怎么做。

感谢您的意见/答案。

1 个答案:

答案 0 :(得分:6)

是的,实际上,虽然语法与您列出的内容有很大不同。 threading包正好实现了这种东西,借用了Clojure的线程宏。使用threading,您的函数将如下所示:

(require threading)

(define (safestr sentstr)
  (~>> sentstr
       string->list
       (remove* (list #\| #\; #\: #\/ #\\ #\' #\"))
       list->string))

有关详细信息,请查看~>>的文档。

您还可以使用λ~>>来消除完全命名参数的需要:

(require threading)

(define safestr
  (λ~>> string->list
        (remove* (list #\| #\; #\: #\/ #\\ #\' #\"))
        list->string))

还有point-free包,它使用高阶函数而不是宏来实现类似的功能。与curly-fn之类的lambda速记包配对时,结果看起来非常类似于使用threading的版本而不需要使用宏:

#lang curly-fn racket/base

(require point-free)

(define safestr
  (λ~> string->list
       #{remove* (list #\| #\; #\: #\/ #\\ #\' #\")}
       list->string))