【问题标题】:How might I format an alist in common lisp?如何在 common lisp 中格式化 alist?
【发布时间】:2009-08-12 01:10:29
【问题描述】:

我开始给我写一些 Common Lisp 并且刚刚掌握了将内容组合在一起并格式化它们的窍门。

假设我有一个列表,如下所示:

(defvar *map* '((0 . "zero") (1 . "one") (2 . "two")))

我该如何格式化它?

0: zero
1: one
2: two

我在想(format t "~{~{~a: ~a~}~%~}" *map*) 之类的东西,但这会产生错误,因为“零”不是一个列表,你不能开车。

当然,做(format t "~{~a~%~}" *map*) 打印

(0 . "zero")
(1 . "one")
(2 . "two")

应该是这样,但这不是我想要的。有没有比(dolist (entry *mapping*) (format t "~a: ~a~%" (car entry) (cdr entry))) 更好的方法来做到这一点?

【问题讨论】:

    标签: formatting lisp format common-lisp string-formatting


    【解决方案1】:

    Freenode 上的#cl-gardeners 频道​​建议像这样进行解构循环绑定:

    (loop for (a . b) in *mapping*
      do (format t "~a: ~a" a b))
    

    【讨论】:

      【解决方案2】:

      你是对的,看起来没有任何方法可以从 FORMAT 中挑选出一个 cons 单元格。

      如果您定义另一个函数来格式化单个关联:

      (defun print-assoc (stream arg colonp atsignp)
        (format stream "~A: ~A" (car arg) (cdr arg)))
      

      那么就很简单了:

      (format t "~{~/print-assoc/~%~}" *map*)
      

      我不确定这是否是一种改进。一方面,它有点复杂,但另一方面,它确实将 print-assoc 分解为一个(可重用的)函数,这可能很有用。

      【讨论】:

      • 您应该在格式中使用限定的函数名称。 FORMAT 会解析 package 中的指定符号,而你永远不会知道调用 format 时的 package 是什么。
      【解决方案3】:

      我认为这里的外卖课程实际上是不要为您的列表使用虚线列表。当然,您节省了一个 cons 单元格,但是您放弃了所有不错的序列和列表功能。这不值得。您的格式化示例对于完整的列表来说是微不足道的:

      (defvar *map* '((0 "zero") (1 "one") (2 "two")))
      (format t "~:{~a: ~a~}" *map*)
      

      【讨论】:

        【解决方案4】:

        我认为没有比这更好的方法了;我会用map():

        (format t "~{~a~%~}"
          (map 'list
            #'(lambda (entry)
              (format nil "~a: ~a" (car entry) (cdr entry))
            *map*))
        

        【讨论】:

          【解决方案5】:

          使用

          将 alist 单元格 (a . 2) 转换为列表 (a 2)
          (mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*)
          

          然后进行格式化处理。

          例如,将((a . 2) (b . 3)) 打印为"a=2&b=3"

          使用

          (format t "~{~{~a~^=~}~^&~}" (mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-06
            • 1970-01-01
            • 2011-01-22
            • 1970-01-01
            • 1970-01-01
            • 2016-07-04
            相关资源
            最近更新 更多