簡體   English   中英

在球拍中管道

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM