2016-08-12 64 views
3

是否可以在球拍的配管中输出一个功能。例如,可以重写下列代码:在球拍中配管

(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

我不知道为什么,这是downvoted ... – molbdnilo

+1

行话注意到,虽然:“输出”这个词几乎从来不用于引用函数的结果或返回值,并且Scheme或Racket中没有“语句”。谷歌搜索这些词可能不会带来好的结果。 – molbdnilo

回答

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包,它实现了使用高阶函数,而不是宏类似的功能。当一个lambda速记包像curly-fn配对,结果结束了,而无需使用宏看上去很类似于使用threading版本:

#lang curly-fn racket/base 

(require point-free) 

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

使用线程,为什么没有()周围的字符串 - >列表和列表 - >字符串,而有围绕删除*。是不是因为前两个没有其他论点? – rnso

+1

@rnso是的,这是正确的。 “threading”的文档更详细地解释。 –

+0

您是否可以包含不使用先前输出并且仍然让它传递到下一行的语句?例如,你可以在“string-> list”行之后加入一行(println“here”)吗? – rnso