0

在 Arc 中有一个宏叫做in

> (let x 1
    (in x 4 5 6))
nil
> (let x 1
    (in x 1 5 6))
t

检查它的第一个参数是否等于任何其他参数。我想要一个带有参数和列表的版本(语义上与 Python 相同in),所以我写道:

(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>
4

1 回答 1

1

要回答您的直接问题,您可以使用mem,如下所示:

arc> (let x 3
    (mem x '(1 2 3 4)))
(3 4)

此外,没有理由这应该是一个宏。它不做任何需要宏的事情。

但是让我们看看为什么宏不起作用:

arc> (macex1 '(in? 1 '(1 2 3)))
(in 1 quote (1 2 3))

啊,我们将值“引用”。

以下是我们希望代码扩展的方式:

(in? 1 '(1 2 3))

应扩展为:

(in 1 1 2 3)

但如前所述,我们甚至不希望它首先成为一个宏。忽略mem,可以写成:

(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
于 2015-04-10T07:26:47.757 回答