【问题标题】:Is it possible to get FORMAT to ignore undefined format directives?是否可以让 FORMAT 忽略未定义的格式指令?
【发布时间】:2020-06-21 23:41:53
【问题描述】:

我想知道是否可以告诉 FORMAT 忽略未定义的格式指令。我查看了 CLHS 中 FORMAT 的页面,但什么也没看到。

我想要做的是让 FORMAT 忽略格式字符串中的 ~m 并输出 ~m 而不是尝试用某些东西替换它。我的计划是到那时我将调用另一个知道如何处理~m 的函数。

我想一个相关的问题是,有没有办法定义一个函数来处理一个没有定义的格式指令?

期待一些问题。 (1) 我想一种解决方法是将占位符替换为~m,然后再将其替换回去并继续。如果一切都失败了,我想我会这样做。 (2) 我猜另一个通用策略是先调用另一个函数,处理~m,然后在结果上调用 FORMAT。不幸的是,其他函数可以识别一些相同的指令,而对其他函数则不认可;它不能只识别~m 并忽略其他所有内容。

【问题讨论】:

  • 您能否在格式字符串中使用"~~m" 在输出中生成"~m",然后将其提供给其他字符串处理函数?
  • 感谢您的回复。这是个好主意,我想这会奏效,尽管我希望避免修改控制字符串。

标签: format common-lisp


【解决方案1】:

您可以使用 ~/name/ 定义自己的格式指令,其中 name 是被调用函数的名称。在您的情况下,您将拥有:

(format t "~/m/" 1)

(defun m (stream n colon-mod at-mod) 
   (format stream "~a" n)) ; or do something else with n

您仍然需要更改控制字符串,但您可以添加一个预处理步骤,将“~m”替换为“~/m/”。

【讨论】:

  • OA的问题不太好理解。您不需要~m,因为您现在已经定义了用n 代替~m 的函数。但是谢谢,不知道可以定义自己的格式指令。
【解决方案2】:

我认为没有一种可移植的方式(实现可能让你做各种魔术)。我会写一个 quote-weird-tildes 和 dequote-weird-tildes 对函数,然后编写如下代码:

(defun format/qw (control &rest args)
  (declare (dynamic-extent args)
           (type string control))       ;can't be a function
  (dequote-weird-tildes
   (apply #'format nil (quote-weird-tildes control) args)))

现在你有了一个看起来像(format nil ...) 的函数,而且使用起来并不难。为了获得额外的价值,如果没有必要,引用和取消引用函数不应包含字符串。

【讨论】:

    【解决方案3】:

    来自http://www.lispworks.com/documentation/lw50/CLHS/Body/22_c.htm

    format 的控制字符串参数实际上是一个格式控件。 也就是说,它可以是格式字符串或函数,例如 格式化程序宏返回的函数。

    所以你可以这样做:

    (defmacro frmt (control-string)
      (let ((str (cl-ppcre:regex-replace-all "~m" control-string "~~m"))) 
        `(formatter ,str)))
    

    现在:

    (format t (frmt "~m~A") 1)
    

    输出:

    ~m1
    NIL
    

    这样您就不必直接修改控制字符串。 您必须修改对format 的调用以包含frmt。

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 2021-11-02
      • 2021-10-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多