Lisp 使用列表项形成新符号的步骤

Lisp 使用列表项形成新符号的步骤,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,假设我有两个lisp列表 (setq a'(pq)) (setq b’(1-2)) (a车)是p车 (b车)是1 现在我想定义一个符号(测试p1),但是如果我使用下面的 (设置c'(测试(a车)(b车))) 我得到(测试(a车)(b车)) 这是可以理解的,但我只是想知道如何将这些(a车)替换为p,将(b车)替换为1,并形成一个新的符号“(测试P1) 谢谢如果您想制作一个列表,您想要的功能是列表: (list 'test (car a) (car b))` ;; creates/update

假设我有两个lisp列表

(setq a'(pq))
(setq b’(1-2))
(a车)是p车
(b车)是1
现在我想定义一个符号(测试p1),但是如果我使用下面的

(设置c'(测试(a车)(b车)))
我得到(测试(a车)(b车)) 这是可以理解的,但我只是想知道如何将这些(a车)替换为p,将(b车)替换为1,并形成一个新的符号“(测试P1)


谢谢

如果您想制作一个列表,您想要的功能是
列表

(list 'test (car a) (car b))`
;; creates/updates binding *x* to point at the newly created list (test p 1)
(defparameter *c* (list 'test (car *a*) (car *b*)))
将是列表
(测试p 1)


请注意,
quote
(缩写为
,因此
(x)
(quote(x))
相同)的目的只是告诉求值者,后面的是文字数据,而不是代码。因此,在与
(list'test…
)相同的
(list(quote test)
中,然后
quote
告诉评估者
test
被用作文本数据,而不是绑定的名称,类似地,
(pq)
意味着“这是一个包含元素
p
q
的文本列表”,虽然
(p q)
表示“这是一种评估形式,其含义取决于
p
是什么”)

首先,不应在未绑定变量上使用
setq
。您可以对已建立的变量使用
setq
。对于全局变量,也应使用
*耳罩*

(defparameter *a* '(p q))
(defparameter *b* '(1 2))
(car *a*) ; ==> p
(car *b*) ; ==> 1
quote将使用quotes结构作为数据。这意味着,除了逐字记录数据外,您编写的所有
'expr
都不会被评估。使用
cons
创建新列表。例如

;; creates/updates binding *x* to point at the newly created list (test p 1)
(defparameter *c* (cons 'test 
                        (cons (car *a*) 
                              (cons (car *b*) 
                                    '()))))
cons
是原语,但是CL还有其他几种创建列表的方法。例如,与函数
列表
相同:

(list 'test (car a) (car b))`
;; creates/updates binding *x* to point at the newly created list (test p 1)
(defparameter *c* (list 'test (car *a*) (car *b*)))
第二,使用
quasikote
/
unquote
/
unquote拼接
使结构变得更为复杂

;; creates/updates binding *x* to point at the newly created list (test p 1)
(defparameter *c* `(test ,(car *a*) ,(car *b*)))

;; more complex example
(defmacro my-let ((&rest bindings) &body body)
  `((lambda ,(mapcar #'car bindings)
      ,@body)
    ,(mapcar #'cadr bindings)))

(macroexpand-1 '(my-let ((a 10) (b 20)) (print "hello") (+ (* a a) (* b b))))
; ==> ((lambda (a b) 
;       (print "hello") 
;       (+ (* a a) (* b b)))
;      (10 20))

请注意,这只是由
cons
list
append
组成的相同结构的一部分。它可能会优化为最小的内存使用,因此将共享结构。例如,
`(,xbc)
在一个过程中将执行
(cons x'(bc))
,这意味着如果您创建两个版本,它们的
cdr
将是
eq
,您应该避免对这些部分进行变异。

要完成tfb的答案,您可以编写

`(test ,(car a) ,(car b)
这完全是相同的

(list 'test (car a) (car b)

谢谢tfb的帮助,问题是我需要(测试p1)是一个符号。(要通过symbolp测试)那么,或者如果您可以帮助我将此列表转换为symbol?@B.Hong,我认为您需要更清楚地了解您想要的内容:您想要一个名称为字符串的符号吗?真正地如果你这样做,这看起来很像是一种困惑。你到底想实现什么?谢谢你,tfb,是的,我没有很好地描述它,因为我是一名学生,对lisp非常陌生,尝试用这个来解决一个任务谢谢Sylvester的详细解释,但我希望这个列表是一个符号,这样它就可以通过symbolp测试(返回true)。有办法吗?@B.Hong您的意思是要定义绑定。符号是
'test
,而
test
是绑定。这不是我用
(defparameter*c*`(test,(car*a*),(car*b*))所做的吗。如果你在之后写
*c*
,你会得到
(测试p1)
。您是否建议使用带有文本
(测试第1页)
的符号?与评估
”|(测试第1页)|
相同?谢谢Sylwester,是的,我没有很好地描述它,因为我是一名学生,对lisp非常陌生,尝试着用它来解决作业