0
假設我想用curried語法定義一個像format
這樣的函數。我將如何處理可以通過的附加參數?例如,我希望能夠做一些類似如下:如何在Racket中使用任意數量的參數進行柯里化?
(((format "~a ~a") 5) 9)
假設我想用curried語法定義一個像format
這樣的函數。我將如何處理可以通過的附加參數?例如,我希望能夠做一些類似如下:如何在Racket中使用任意數量的參數進行柯里化?
(((format "~a ~a") 5) 9)
是的,這是棘手的。問題是如何format
應該知道它有所有的論點。我猜你希望格式能解析它的輸出字符串並確定它需要多少個參數,然後在接收到正確數量的參數時觸發。你將自己捲起來。類似的東西(注意:未經測試的代碼):
#lang racket
;; given a format-string, return a curried function that
;; accepts the format-string's arguments one at a time
(define (curried-format fmt-str)
(define num-args-expected (count-format-string-args fmt-str))
(define (so-far->waiter so-far)
(lambda (arg)
(define new-args (cons arg so-far))
;; do we have all of the args?
(if (= (length new-args) num-args-expected)
;; yay! call format:
(apply format fmt-str (reverse new-args))
;; nope: wait for some more:
(so-far->waiter new-args))))
(so-far->waiter '()))
這個,這很重。我猜想爲了格式化和打印/寫入字符串的目的,這樣的方法將起作用。不過,我很好奇,如果你不知道這個函數會帶來多少個參數呢?在目前的柯里語法規則下,甚至可能會出現這種情況嗎? – podington
咖喱功能怎麼知道什麼時候開火? –
這就是爲什麼我不認爲它會起作用。我希望可以通過'(define(f。l)...)'語法來處理,你可以使用任意數量的參數,你可以使用'apply'在列表中調用一個函數。 – podington