Macros 编写我自己版本的'in'作为Arc宏

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

在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)
     (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))
,看看它是否有区别。呃,我刚刚用我的完整代码更新了它。