gpt4 book ai didi

list - Lisp:如何使用 let 函数将 2 个列表合并为 1 个列表?

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

我想创建一个函数来读取我的 2 个输入列表并将列表中的内容组合成 1 个列表,这样我就可以将这 1 个列表用于另一个函数。

我试过使用let函数

    (defun sumup(p1 p2)
(let ((sum (append(list p1 p2)) ))
(format t "the sum is ~a" sum)
(poly sum)
) )

当我输入输入列表时

    (sumup+ '(5 (x 2)) '(3 (x 2)))

结果为

    the sum is ((5 (x 2)) (3 (x 2)))
the poly term is (8 (x 2))

这里是函数 poly,它将读取输入列表,并进行加法运算。

     (defun poly (p1)
(let((x1(car(car(cdr(car p1))))) (x2(car(car(cdr(car(cdr p1))))))
(e1(car(cdr(car(cdr(car p1)))))) (e2(car(cdr(car(cdr(car(cdr p1)))))))
(c1(car(car p1))) (c2(car(car(cdr p1))))
(remainder(cdr(cdr p1)))
)
(if(and(null remainder)(null c2))
(format t "the poly term is (~a (~a ~a))" c1 x1 e1)
)

(if(and(equal x1 x2)(equal e1 e2))
(poly(append (list(list(+ c1 c2)(list x1 e1))) remainder)))

)
)

所以用这个函数poly

(poly '((5(x 3))(3(x 3))(1(x 3))(4(x 3))))

你会得到

the poly term is (13 (x 3))

所以我选择的表示 5x^2 的格式将是 (5(x 2)) 这就是我引用的原因。

sumup 函数现在可以合并 2 个项,但是如果

(sumup+ '(5 (x 2)) '((3 (x 2)) (2 (x 2))))

我会得到

the sum is ((5 (x 2)) ((3 (x 2)) (2 (x 2)))) 

我如何将其更改为 ((5 (x 2)) (3 (x 2)) (2 (x 2)) 可用于 poly函数?

最佳答案

表达式 '(sum) 表示一个列表文字。它是 quote 运算符的简写,与 (quote (sum)) 的含义完全相同。

引号运算符禁止将其参数作为表达式求值,并按字面意思生成参数;即它的意思是“不要尝试调用名为 sum 的函数;只需给我实际列表 (sum):一个包含符号 sum 的单元素列表”。

因此,例如 (quote (+ 2 2)) 或者,使用通常的速记,'(+ 2 2) 返回 (+ 2 2) ,字面意思。如果我们删除引号并计算 (+ 2 2),那么我们将得到 4

现在,如果我们采用 '(sum) 并简单地删除引号,它将不起作用,因为现在我们正在评估表示的 (sum) 形式调用名称为 sum 的函数,不带参数。当然,不存在这样的函数,所以调用是错误的。

在 Lisp 中有一种特殊的“充满活力的引用”,类似于常规引用。它叫做backquote .要使用反引号,我们将撇号 ' 简写替换为反引号:`

喜欢报价,backquote抑制评估。但是,在反引号内,我们可以通过在它们前面加上逗号来指示“不计算”规则的异常(exception)元素,如下所示:

`(,sum)

如果我们有一个名为 sum 的变量,它包含一个列表(或任何其他对象),并且在该范围内我们评估上面的反引号,该反引号将计算包含该对象的一个​​元素的列表.就像我们计算表达式 (list sum) 一样。

更复杂的准引用示例:

(let ((a "hello")
(b 42))
`(1 2 3 ,a 4 ,b b ,(+ 2 2) (+ 2 2)))

-> (1 2 3 "hello" 4 42 b 4 (+ 2 2))

反引号内不带逗号的对象都是字面意思:b 不作为变量求值,而是保留为b(+ 2 2) 保持 (+ 2 2) 并且不会减少到 4,这与 ,(+ 2 2) 不同。

顺便说一句,在 poly 函数中,你有这个表达式:

(append (list (list (+ c1 c2) (list x1 e1))) remainder)

这有点难读。即使没有使用引用 Material ,它仍然是应用反引号的绝佳目标。使用反引号,我们可以像这样重写表达式:

`((,(+ c1 c2) (,x1 ,e1)) ,@remainder)

appendlist 调用的所有干扰都消失了,我们只看到正在构建的列表的形状。

Technical note: the backquote isn't a shorthand for any specific form syntax in Common Lisp. Whereas 'X means (quote X), as discussed, `X doesn't have such a correspondence; how it works is different in different implementations of Common Lisp. The comma also doesn't have a specific target syntax. In the Lisp dialect known as Scheme, `X corresponds to (quasiquote X) and ,Y corresponds to (unquote Y). This is defined by the Scheme language and so is that way in all implementations. Backquote is also known as "quasiquote", especially among Scheme programmers.

关于list - Lisp:如何使用 let 函数将 2 个列表合并为 1 个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34166180/

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