首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在common lisp中将列表元素定义为新变量

在common lisp中将列表元素定义为新变量
EN

Stack Overflow用户
提问于 2013-01-01 00:22:30
回答 3查看 673关注 0票数 1

我有一个Common Lisp格式的列表,如下所示

代码语言:javascript
复制
((1 2) (3 4) (5 6)) 

这是变量list的值,我想有三个新的变量,它们的值是列表中的元素。例如:

代码语言:javascript
复制
list-1 (1 2)
list-2 (3 4)
list-3 (5 6)

有没有什么函数可以做这个操作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-01 02:44:10

使用setqfirst (或nthelt)设置

代码语言:javascript
复制
(setq list-1 (first list)
      list-2 (second list)
      list-3 (third list))

或要绑定的destructuring-bind

代码语言:javascript
复制
(destructuring-bind (list-1 list-2 list-3) list
  ...)

同样,destructuring-bind 变量而不是变量(即,它类似于let,而不像setq)。

票数 10
EN

Stack Overflow用户

发布于 2013-01-02 15:01:49

将列表的元素绑定到list-#形式的名称的概念可以推广。

您可以创建一个函数来生成一个lambda,使用序号列表名称作为参数,并指定一个正文:

代码语言:javascript
复制
(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,编译它,并将其应用于列表:

代码语言:javascript
复制
(defmacro letlist (list &body body)
  (let ((assignments (gensym)))
    `(let ((,assignments ,list))
       (apply (compile nil (make-list-lambda (length ,assignments) ',body))
          ,assignments))))

这样,赋值被本地化到lambda主体:

代码语言:javascript
复制
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-#参数!

票数 2
EN

Stack Overflow用户

发布于 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语言的新手,只是为了好玩而学习。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14103827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档