代码之家  ›  专栏  ›  技术社区  ›  Paul Nathan

解析公共lisp列表中的符号

  •  3
  • Paul Nathan  · 技术社区  · 14 年前

    假设我有一个函数

    CL-USER> (defun trimmer (seq) "This trims seq and returns a list"
          (cdr 
             (butlast seq)))
    TRIMMER
    CL-USER> (trimmer '(1 2 3 VAR1 VAR2))
    (2 3 VAR1)
    CL-USER> 
    

    请注意,由于引用,var1和var2是如何解决的。假设我想将符号var1和var2解析为它们的值——是否有一个标准函数可以这样做?

    2 回复  |  直到 8 年前
        1
  •  6
  •   Svante    14 年前

    不使用 quote 用变量创建一个列表;使用 list 相反:

    CL-USER> (trimmer (list 1 2 3 var1 var2))
    (2 3 value-of-var1)
    

    (何处) value-of-var1 是的价值 var1 )

    Quote 只会阻止对其论点的评估。如果它的参数恰好是一个列表文本,则返回该文本。但是,要创建不只是文本的列表,请使用 列表 . 你 可以 使用后引号语法,但在这种情况下这是相当模糊的。

        2
  •  4
  •   Gareth Rees    14 年前

    Backquote 是将值插入引用列表的常用方法:

    > (setq var1 4 var2 5)
    5
    > `(1 2 3 ,var1 ,var2)
    (1 2 3 4 5)
    

    编辑添加:如果要处理列表,以便用符号替换它们 symbol-value ,那么您需要这样的函数:

    (defun interpolate-symbol-values (list)
      "Return a copy of LIST with symbols replaced by their symbol-value."
      (loop for x in list
            collect (if (symbolp x) (symbol-value x) x)))
    
    > (interpolate-variables '(1 2 3 var1 var2))
    (1 2 3 4 5)
    

    然而,这似乎是一件很奇怪的事情。你能多说一点你想达到的目标吗?几乎可以肯定,还有比这更好的方法。