2016-08-12 56 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