2017-12-02 8 views
1

私は、Racket-Stampsで遊んでいます。これは、タイプされたRacketと通常のRacketを組み合わせたものです。どのようにAny型の値をRealに変換するのですか?

(define bounding (make-parameter '())) 

;; snip 

(when (not (empty? (bounding))) 
    (let-values ([(x1 y1 x2 y2) (apply values (bounding))]) 
    (send pr set-bounding x1 y1 x2 y2))) 

私はこのリストが型なしラケットから来るのでしかし、それは実際にどれのリストで、新しい機能やレアルのリストで関数を呼び出すための試み以下のコードを書いていますそして、上記のコードを呼び出して別のファイルに:

(bounding '(-20 -100 100 2)) 

ここでエラーがあります:

タイプチェッカー:悪い引数は「適用 `で機能する: ドメイン:B ... は#f * 引数B:(Listof任意)* 中:(値(境界)を適用)

は、どのように私はListof RealListof Anyを変換するのですか?

+0

私は空を作ることができることを発見しました'' ann'関数を使ってRealのリストを返します: '(境界を定義する(ann '()(Listof Real)))') ' - しかし、私はまだエラーを返します。 bout 'apply'、それは' make-parameter'と 'values'と何か関係がありますか? –

+0

'apply'は型付きラケットではほとんどの場合スマートではありません。特に、入力として任意の長さのリストがあり、出力として期待される固定数の値(4つ)があるためです。 –

+0

また、 'values'の型を調べると、ゼロのものや1つ以上のものは許されますが、0以上のものは許されません。私は '(apply values ...)'を使わずにこれを設計しようとします。 –

答えて

1

ここでは、apply関数は入力として任意の長さのリストが与えられていますが、コンテキストには正確に4つの値が必要です。リストの長さが4以外の場合、失敗します。

boundingには、空のリストまたはのリストが正確に4の実数のリストを含むように思われます。

(: bounding : (Parameterof (U Null (List Real Real Real Real)))) 
(define bounding (make-parameter '())) 

型付きラケットが表示されるように続いて(bounding)の内容は空であり、その後、4個の数字のリストであること、それに依存しているかどうか、あなたのプログラムをテストするたびに、あなたは、最初のローカル変数に値を配置する必要がありテストとその下の使用との間の接続。

つまり

、あなたの例では

(let ([bounding-v (bounding)]) 
    (if (not (empty? bounding-v)) 
     (.... bounding-v ....) 
     ....)) 

中に、パターン

(if (not (empty? (bounding))) 
    (.... (bounding) ....) 
    ....) 

を変換、その変換ができます:

(: bounding : (Parameterof (U Null (List Real Real Real Real)))) 
(define bounding (make-parameter '())) 

.... 

(let ([bounding-v (bounding)]) 
    (when (not (empty? bounding-v)) 
    (let-values ([(x1 y1 x2 y2) (apply values bounding-v)]) 
     (send pr set-bounding x1 y1 x2 y2)))) 
関連する問題