我有一个Common Lisp格式的列表,如下所示
((1 2) (3 4) (5 6)) 这是变量list的值,我想有三个新的变量,它们的值是列表中的元素。例如:
list-1 (1 2)
list-2 (3 4)
list-3 (5 6)有没有什么函数可以做这个操作?
发布于 2013-01-01 02:44:10
使用setq、first (或nth和elt)设置
(setq list-1 (first list)
list-2 (second list)
list-3 (third list))或要绑定的destructuring-bind
(destructuring-bind (list-1 list-2 list-3) list
...)同样,destructuring-bind 变量而不是变量(即,它类似于let,而不像setq)。
发布于 2013-01-02 15:01:49
将列表的元素绑定到list-#形式的名称的概念可以推广。
您可以创建一个函数来生成一个lambda,使用序号列表名称作为参数,并指定一个正文:
(defun make-list-lambda (n body)
(let ((list-names (loop for index from 1 to n
collect (intern (format nil "LIST-~D" index)))))
`(lambda ,list-names
(declare (ignorable ,@list-names))
,@body)))然后创建一个宏来创建lambda,编译它,并将其应用于列表:
(defmacro letlist (list &body body)
(let ((assignments (gensym)))
`(let ((,assignments ,list))
(apply (compile nil (make-list-lambda (length ,assignments) ',body))
,assignments))))这样,赋值被本地化到lambda主体:
CL-USER> (letlist '(a b c d e f)
(format t "list-1: ~A~%" list-1)
(format t "list-3: ~A~%" list-3))
list-1: A
list-3: C
NIL注意:表单将在每次宏调用时编译,因为只有在列表出现之前,才能知道有多少list-#参数!
发布于 2013-12-01 03:21:10
首先将列表设置为一个变量,例如mylist。然后使用函数格式输出所需的输出。我正在使用CLISP。希望这能有所帮助。这是实际的REPL输出。
(setf mylist '((1 2) (3 4) (5 6)) )
((1 2) (34) (5 6))
(format t "list-1 ~d~%list-2 ~d~%list-3 ~d" (car mylist) (second mylist) (last mylist)) list-1 (1 2) list-2 (3 4) list-3 ((5 6)) NIL 142>有人能告诉我如何去掉上面输出中的“NIL”吗?我是Lisp语言的新手,只是为了好玩而学习。
https://stackoverflow.com/questions/14103827
复制相似问题