Macros 编写我自己版本的'in'作为Arc宏
在Arc中有一个名为In的宏Macros 编写我自己版本的'in'作为Arc宏,macros,lisp,arc-lisp,Macros,Lisp,Arc Lisp,在Arc中有一个名为In的宏 > (let x 1 (in x 4 5 6)) nil > (let x 1 (in x 1 5 6)) t 这将检查其第一个参数是否等于任何其他参数。我想要一个采用参数加列表的版本(语义上与中Python的相同),因此我写道: (assign weak-tens* '(11 12)) (mac in? (elt lst) (cons 'in (cons elt lst))) (def transform-deck (deck
> (let x 1
(in x 4 5 6))
nil
> (let x 1
(in x 1 5 6))
t
这将检查其第一个参数是否等于任何其他参数。我想要一个采用参数加列表的版本(语义上与中Python的相同),因此我写道:
(assign weak-tens* '(11 12))
(mac in? (elt lst)
(cons 'in (cons elt lst)))
(def transform-deck (deck)
(map [if (in? _ weak-tens*) #\T _] deck))
输出:
arc> (load "main.arc")
*** redefining in?
map: contract violation
expected: list?
given: '(_ . weak-tens*)
argument position: 2nd
other arguments...:
#<procedure:ac-niltree>
arc>(加载“main.arc”)
***重新定义?
地图:违反合同
期望:列表?
给定:'(u.弱十位数*)
论点立场:第二
其他论点…:
#
要回答您的即时问题,您可以使用mem
,如下所示:
arc> (let x 3
(mem x '(1 2 3 4)))
(3 4)
(def in? (elt lst)
(if (no lst)
nil
(is elt ;;if we've found the element
(car lst))
t
(in? elt (cdr lst)))) ;;otherwise recurse
此外,没有理由将其作为宏。它不做任何需要宏的事情
但让我们看看宏不起作用的原因:
arc> (macex1 '(in? 1 '(1 2 3)))
(in 1 quote (1 2 3))
啊,我们把价值放在“报价”上
下面是我们希望代码扩展的方式:
(in? 1 '(1 2 3))
应扩展到:
(in 1 1 2 3)
但正如前面提到的,我们甚至不希望它首先是一个宏。忽略mem
,可以按如下方式编写:
arc> (let x 3
(mem x '(1 2 3 4)))
(3 4)
(def in? (elt lst)
(if (no lst)
nil
(is elt ;;if we've found the element
(car lst))
t
(in? elt (cdr lst)))) ;;otherwise recurse
您使用的是什么版本的Arc?我看没什么不对劲,但我有点困。试着看看(macex1'(inl1'(12)))的结果。
。你也可以尝试将它定义为(mac-inl(elt-lst)(cons'in(cons-elt-lst))
,看看它是否有区别。呃,我刚刚用我的完整代码更新了它。