0
私はformat
のような関数をカルト構文で定義したいとしましょう。どのように私は通過することができる追加の引数を処理するだろうか?例えば、私は次のような何かをできるようにしたいでしょう:ラケットで任意の数の引数でカリングを使用するにはどうすればよいですか?
(((format "~a ~a") 5) 9)
私はformat
のような関数をカルト構文で定義したいとしましょう。どのように私は通過することができる追加の引数を処理するだろうか?例えば、私は次のような何かをできるようにしたいでしょう:ラケットで任意の数の引数でカリングを使用するにはどうすればよいですか?
(((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