[英]Piping in 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但是找不到怎么做。
感謝您的意見/解答。
是的,實際上,雖然語法與您列出的內容有很大不同。 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.