2016-05-25 25 views
1

パターンマッチングを試行していますが、コンパイラではなくChickenインタプリタでしか動作しません。ここでチキンコンパイラでパターンマッチングコンパイルエラーが発生しましたが、チキンインタプリタではありません

はインタプリタでの例です:これは(csc src/test.scmを)失敗し

(declare (uses matchable)) 

(match '((1 2) (3 4)) 
     [(a . b) b] 
     [() 0]) 

:ここ

CHICKEN 
(c) 2008-2015, The CHICKEN Team 
(c) 2000-2007, Felix L. Winkelmann 
Version 4.10.0 (rev b259631) 
freebsd-unix-clang-x86-64 [ 64bit manyargs dload ptables ] 
compiled 2015-08-04 on yves.more-magic.net (Linux) 

#;1> (use matchable) 
; loading /usr/local/lib/chicken/7/matchable.import.so ... 
; loading /usr/local/lib/chicken/7/chicken.import.so ... 
; loading /usr/local/lib/chicken/7/lolevel.import.so ... 
; loading /usr/local/lib/chicken/7/matchable.so ... 
#;2> (match '((1 2) (3 4)) [(a . b) b] [() 0]) 
((3 4)) 
#;3> 

は、コンパイルされたバージョンである私がやった

Syntax error: (src/test.scm:4) - malformed expression: (a . b) 
inside expression `(match ...)' 


Expansion history: 

<syntax>   (##core#begin (match (quote ((1 2) (3 4))) ((a . b) b) (() 0))) 
<syntax>   (match (quote ((1 2) (3 4))) ((a . b) b) (() 0)) 
<syntax>   (quote ((1 2) (3 4))) 
<syntax>   (##core#quote ((1 2) (3 4))) 
<syntax>   ((a . b) b) 
<syntax>   (##core#let ((g0 (a . b))) (g0 b)) 
<syntax>   (a . b)  <-- 

何ミス?

答えて

3

コンパイル時にインポートライブラリを読み込む必要があります。 declareの文は、実行時にmatchableに依存していると言っています。

(declare (uses matchable))ではなく、(use matchable)というように、通訳者と同じ操作を行うだけです。

+0

ありがとうございました!あなたはもう少し詳細に行くことができますか? 'declare'ステートメントは実際にどこで使われていますか?ファイルに '(declare()matchable)'と '(matchable use)'の両方を入れるはずですか? – eatonphil

+1

'(マッチ可能なものを使用する)'は、 'matchable'ユニットに対してコンパイル時に依存することを示します。コンパイル単位は、静的リンク(別々のコンパイル)を実行するときに最も役立ちます。動的リンクが必要な場合は 'declare'を使用せず、'(use ...) 'のみを使用します。 Useは実行時に拡張をロードし、対応するモジュールの識別子もインポートします。 – sjamaan

+1

これはCHICKEN 5でかなり単純化されます。それは初心者のための頻繁な不満の源です。これは主に歴史的な理由によるものです(モジュールは最近の追加であり、コンパイル単位は人々が使う最も一般的なものではありませんが、コンパイルを個別にサポートすることは、クロスコンパイルを可能にするため、CHICKENの重要な設計目標であるため、このマニュアルでは大きな注目を集めています。 – sjamaan

関連する問題