【问题标题】:Printing a list with infix notation打印带有中缀符号的列表
【发布时间】:2019-10-28 08:53:03
【问题描述】:

我想使用format 将 s 表达式转换为带有中缀符号的字符串。如何使用format 完成此操作?

示例;

(format t "<insert format controls here>" (1 2 3) '*)
=> "1 * 2 * 3"

【问题讨论】:

标签: lisp common-lisp


【解决方案1】:

此答案包含错误代码。

简单,只需使用custom formatters

(format t "~/acquire/~/disseminate/" '(1 2 3) '*)

它们的定义如下:

(let ((memory))
  (defun cl-user::acquire (stream list &optional colonp atsignp)
    (declare (ignore colonp atsignp stream))
    (setf memory list))
  (defun cl-user::disseminate (stream operator &optional colonp atsignp)
    (declare (ignore colonp atsignp))
    (format stream (concatenate 'string "~{~a~^ " (string operator) " ~}") memory)
    (setf memory nil)))

例如:

CL-USER> (format t "~/acquire/~/disseminate/" '(1 2 3) '*)
1 * 2 * 3

memory 变量在两个函数的词法范围内,这允许它们进行数据通信。第一个存储列表,第二个使用它。如果您从不调用第二个函数(或第一个函数为 nil),memory永远绑定到最后一个列表,这可能是个问题。另请注意,您可能会遇到并发问题。 坦率地说,这不是做你想做的最好的方法,但它可以完成工作。您的要求。

【讨论】:

  • 知道咒语的巫师 - common-lisp - 可塑语言! ;)
  • @RainerJoswig 叹了口气,我会加个锁 ;-)
  • let 超过 lambda 很酷。 let 超过 defun:没那么多。
【解决方案2】:
(format t "~{~A~^ * ~}" '(1 2 3))
;; 1 * 2 * 3
;; NIL
  • ~{~}:循环遍历列表。
  • ~A: 打印人类可读的(a审美)
  • ~^:仅当列表中有后继元素时才打印以下内容。
  • *:中缀,周围有空格。

我曾经问过一个类似的问题。您在末尾添加了'* - 所以您还想控制join 列表元素应该使用哪个分隔符。看看下面的链接—— @Sylwester 给出了公认的答案:Nicer pythonic `join` in common-lisp

(他通过将第二个格式表达式注入格式表达式来做到这一点 - 非常优雅! - 这样就可以拨打(join '(1 2 3) :sep " * "))。

【讨论】:

    【解决方案3】:

    使用str 库*:

    (str:join " * " '(1 2 3))
    ;; "1 * 2 * 3"
    

    这个join 函数是这样定义的:

    (defun join (separator strings)
      (let ((separator (replace-all "~" "~~" separator)))
        (format nil
                (concatenate 'string "~{~a~^" separator "~}")
                strings)))
    

    * 无耻的宣传。

    【讨论】:

      【解决方案4】:

      这是我想出的解决方案。

      (defun compile-arith (expr)
        (format nil (concatenate 'string "~{~(~a~)~^ " (string (car expr)) " ~}")
          (cdr expr)))
      
      (compile-arith '(* 1 2 3))
      
      => "1 * 2 * 3"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 2012-01-12
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        相关资源
        最近更新 更多