Common Lisp从列表

时间:2016-11-05 17:14:17

标签: common-lisp

我有:带有值列表的列表,例如。

(List (list 1 2) (list 3 4 5) (list 1))

注意:它是二维数组,所以我不能得到这样的结构:(LIST (LIST (LIST 1))),换句话说,在二级列表中只能有数字\字母。

我想:创建一个函数,这将使我的列表使用nil填充空字段的列数相同,所以如果我有上面的列表作为输入,我的输出将是:

((1 2 nil nil)
(3 4  5  nil)
(1 nil nil nil))

对不起,它必须简单,但我是Lisp和函数式编程的新手。

注意:我必须只使用CONS和APPEND,但是(这是我的主要问题)CONS会将每个元素放在不同的列表中,APPEND将删除所有nil。

UPD:我已按照下面的说法完成,但我仍有1个问题

(DEFUN FINDMLENGTH (INPUT) 
(COND
    ((NULL INPUT) NIL)
    (T (AND
            (COND ((< MAXLENGTH (length (CAR INPUT))) (SETQ MAXLENGTH (length (CAR INPUT)))))
            (FINDMLENGTH (CDR INPUT))))))

(DEFUN MAKESQUARE (INPUT RowNumb) (prog (a))
(COND
    ((NULL INPUT) NIL)
    (T (AND
            (SETQ SqMatr (APPEND SqMatr (LIST (append (car INPUT) (make-list (- RowNumb (length (CAR INPUT))))))))
            (MAKESQUARE (CDR INPUT) RowNumb)))))
(SETQ SqMatr nil)
(SETQ MAXLENGTH 0)

问题是我目前正在使用全局变量来传递数据,有人可以澄清我如何让他们自己返回变量?

1 个答案:

答案 0 :(得分:2)

您的作业的起点:您可以为每一行使用函数make-list来创建n个元素的列表,其中n =所需的长度 - 您已经拥有的行的长度。这将创建一个包含填充nils的列表。然后,您可以将其附加到初始行。 例如:

(append '(1 2) (make-list (- 4 (length '(1 2))))) => (1 2 nil nil)

为每一行执行此操作,并附加结果。