【问题标题】:Tuple Unpacking Similar to Python, but in Common Lisp元组解包类似于 Python,但在 Common Lisp 中
【发布时间】:2011-08-26 03:25:17
【问题描述】:

有没有一种方法可以将列表的值分配给 Common Lisp 中的符号列表,类似于将元组的值分配给 Python 中的变量?

x, y, z = (1, 2, 3)

类似

(setq '(n p) '(1 2))

其中np 现在分别等于12。以上只是我脑海中的想法,但它不起作用。我尝试使用 apply 如下:

(apply setq '('(n p) '(1 2)))

我是 Lisp 新手,所以如果这是显而易见的事情,请尽量不要太苛刻,请指出正确的方向!谢谢。

PS:我在 Scheme 中看到了关于这样做的帖子以及关于 Common Lisp 中的元组扩展的类似帖子,但是这些对回答我的问题 1)没有太大帮助,因为我没有使用 Scheme,以及 2 ) 因为排名最高的答案只是单词apply

【问题讨论】:

    标签: python list lisp common-lisp iterable-unpacking


    【解决方案1】:

    如果您有一个列表并希望将其值分配给多个变量,则 DESTRUCTURING-BIND 是可行的方法。

    但是,对于 pythonic“返回一个列表或元组,使用一个变量的列表或元组来分配”的情况,使用多个返回值和 MULTIPLE-VALUE-BIND (可能)更简单。

    【讨论】:

      【解决方案2】:

      使用DESTRUCTURING-BIND,它可以做的比元组拆包要多得多。比如关键字赋值,可选参数等。真的,你可以用函数的参数列表做任何事情。

      但如果您实际上没有要解构的列表,并且想一次设置一堆变量,请使用PSETF

      (psetf n 1 2)

      您也可以使用 SETF,但 PSETF 更接近于元组赋值:例如,它适用于交换/置换值。

      # Python
      n, p = p, n
      x, y, z = z, x, y
      
      ;;语言 (psetf n p p n) (psetf x z 是的 zy)

      实际上,您可能会摆脱平凡的 LET。

      另外,不要为任何事情烦恼 SETQ。使用 SETF/PSETF 因为它们更好,而且是执行某些类型任务的唯一方法。

      【讨论】:

      • 对于交换和旋转,有rotatef(rotatef n p)(rotatef x y z)
      【解决方案3】:

      听起来像destructuring-bind(它在底部)可能会做你想做的事。

      另外,HyperSpec 的描述,但我认为另一个链接更好地展示了它。

      (destructuring-bind (x y z) (list 1 2 3) (+ x y z))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        相关资源
        最近更新 更多