代码之家  ›  专栏  ›  技术社区  ›  culebrón

如何在Lisp中列出数组而不是它们的符号?

  •  1
  • culebrón  · 技术社区  · 16 年前

     (defvar p1 #(1 2))
     (defvar p2 #(3 4))
     (mapcar '(lambda (x) (aref x 0)) '(p1 p2))
    
     debugger invoked on a TYPE-ERROR in ...
       The value P1 is not of type ARRAY.
    

    如果使用make array,则会出现相同的错误。

    (aref x 0) (aref x N) 一般情况下?

    5 回复  |  直到 16 年前
        1
  •  3
  •   Svante    16 年前

    '(lambda (x) (aref x 0)) (quote (lambda (x) (aref x 0))) ,这是 函数。你想让它成为一个函数 (function (lambda (x) (aref x 0))) #'(lambda (x) (aref x 0)) ,甚至(因为标准宏) (lambda (x) (aref x 0))

    '(p1 p2) (quote (p1 p2)) . 引号表示参数是 未评估 ,因此名称“P1”和“P2”代表它们自己,而不是它们的值。您得到的类型错误是符号 'P1 不是数组,它只有一个数组作为值。要获取值列表,请使用列表: (list p1 p2) .

    (mapcar #'(lambda (x) (aref x 0)) (list p1 p2))

    编辑:对于减去向量,您应该查看 MAP 功能;请注意,您可以提供多个序列。

        2
  •  3
  •   Xach    16 年前

    (map 'vector #'- p2 p1)
    

    在您的示例中,它返回:

    #(2 2)
    
        3
  •  1
  •   Antti Huima    16 年前

    '(p1 p2)
    

    (list p1 p2)
    

    因为在您的程序中,您实际上尝试将mapcar应用于包含两个元素的列表,即符号p1和符号p2。

        4
  •  0
  •   jkndrkn    16 年前

    (mapcar #'(lambda (x) (aref x 0)) (list p1 p2))
    

    请注意,在 lambda

        5
  •  -2
  •   perp    16 年前

    如果需要,可以使用SYMBOL-VALUE:

    (defvar p1 #(1 2))
    (defvar p2 #(3 4))
    (mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2))
    
    推荐文章