gpt4 book ai didi

macros - 将我自己的 `in` 版本编写为 Arc 宏

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:49 25 4
gpt4 key购买 nike

在 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>

最佳答案

要回答您的即时问题,您可以使用 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))

啊,我们将值“quote”。

下面是我们希望代码展开的方式:

(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

关于macros - 将我自己的 `in` 版本编写为 Arc 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22161662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com