Chicken 编译器中的模式匹配编译错误,但 Chicken 解释器中没有
Pattern matching compile error in Chicken compiler but not in Chicken interpreter
我试图让模式匹配工作,但我只能让它在 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) <--
我错过了什么?
您需要在编译时加载导入库。 declare
语句只是说它在运行时依赖于 matchable
。
只需执行您在解释器中所做的相同操作:(use matchable)
而不是 (declare (uses matchable))
。
我试图让模式匹配工作,但我只能让它在 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) <--
我错过了什么?
您需要在编译时加载导入库。 declare
语句只是说它在运行时依赖于 matchable
。
只需执行您在解释器中所做的相同操作:(use matchable)
而不是 (declare (uses matchable))
。