2016-05-25 25 views
1

我試圖讓模式匹配工作,但我只能得到它在雞解釋器中工作 - 不是編譯器。模式匹配雞編譯器中的編譯錯誤,但不是在雞解釋器

這裏是它在解釋一個例子:

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> 

以下是編譯的版本:

(declare (uses matchable)) 

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

這失敗(csc src/test.scm):

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

簡單地做你在解釋器中的做法:(use matchable)而不是(declare (uses matchable))

+0

謝謝!你有可能進入更多細節嗎? 「聲明」聲明實際上應該用在哪裏?我應該在文件中同時包括''(聲明(使用可匹配))'和'(使用可匹配)嗎? – eatonphil

+1

'(使用可匹配)'表示它對'matchable'單元具有編譯時間依賴性。編譯單元在進行靜態鏈接時非常有用(單獨編譯)。如果你想動態連接,你根本不會使用'declare',但只能使用'(use ...)'。使用將在運行時加載擴展,並導入相應模塊的標識符。 – sjamaan

+1

在雞肉5中,這將會大大簡化。它對於新手來說是一個常常受挫的原因,這主要是由於歷史原因(模塊是最近的補充,編譯單元並不是人們最常用的東西,由於支持單獨編譯是CHICKEN的一個重要設計目標,因爲它也使得交叉編譯成爲可能),所以在手冊中仍然有很多突出的地方。 – sjamaan