在Lisp中定界输出

时间:2019-01-11 16:23:24

标签: formatting lisp common-lisp

我确定这是一个非常基本的问题,但是如何输出定界值?

(defun q (n)
    (if (<= n 2)
        1
        (+
            (q (- n (q (- n 1))))
            (q (- n (q (- n 2)))))))

(loop for x from 1 to 25
     do (
        write (q x)))

上面的代码输出Hofstadter Q序列的前25个项,但它们是串联的:

11233455666888109101111121212121614

可以用逗号,空格或制表符分隔。我曾尝试使用format函数,但对于像我这样的Lisp新手来说,这已经不知所措了。

2 个答案:

答案 0 :(得分:3)

您可以自己编写定界符,例如。 G。 (write ", ")。您还可以使用(terpri)编写(取决于平台的)行分隔符。

对于format,您首先可以了解一些基本用法:

(format <stream> <template> <args…>)
  • <stream>是输出应该去的地方。对于标准输出,请使用t。为了写入文件,您将在此处使用with-open-file创建的流。
  • <template>是模板字符串。那只是一个字符串,但是~字符是特殊的。对于初学者,只需在要插入参数的地方使用~a
  • <args…>与上面~a所使用的参数一样多。

使用这个简单的工具箱,您可以为每个项目执行(format t "~a, " (q x))

格式还有很多其他可能性,例如。 G。它可以自己迭代一个列表,执行不同的输出格式和转义,甚至可以通过用户功能扩展。在超级规格中查找(例如,在clhs.lisp.se)。

答案 1 :(得分:2)

使用https://webpack.js.org/guides/hot-module-replacement或实际上是write-char

(format t "~D: ~:D~%" x (q x))