2016-05-25 5 views
1

Я пытаюсь получить соответствие шаблонов, но я могу заставить его работать только в интерпретаторе Chicken, а не в компиляторе.Ошибка компиляции шаблона в компиляторе Chicken, но не в интерпретаторе цыпленка

Вот пример этого в интерпретаторе:

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

Спасибо! Есть ли вероятность, что вы можете пойти немного подробнее? Где, собственно, должно быть использовано заявление 'declare'? Должен ли я включать в файл как '(объявлять (использует сопоставимые)), так и' (использовать сопоставимые) '? – eatonphil

+1

Параметр '(uses matchingable)' указывает, что он имеет зависимость от времени компиляции в модуле 'matchable'. Компиляционные модули в основном полезны при статической привязке (отдельная компиляция). Если вам нужна динамическая компоновка, вы не будете использовать 'declare' вообще, а только' (use ...) '. Использование будет загружать расширение во время выполнения и импортировать идентификаторы соответствующего модуля. – sjamaan

+1

Это будет значительно упрощено в CHICKEN 5. Это частый источник разочарования для новичков, который в основном объясняется историческими причинами (модули являются более новым дополнением, а единицы компиляции - не самая распространенная вещь, которую люди будут использовать, все еще уделяется много внимания в руководстве, поскольку поддержка отдельной компиляции является важной целью проекта CHICKEN, поскольку она также делает кросс-компиляцию возможной). – sjamaan

 Смежные вопросы

  • Нет связанных вопросов^_^