是否可以在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但是找不到怎么做。
感谢您的意见/答案。
答案 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))