【问题标题】:How to write two values on one line in LISP?如何在 LISP 的一行中写入两个值?
【发布时间】:2021-05-23 04:19:41
【问题描述】:

我是 LISP 新手,刚开始自学。我想使用write-line 并排打印p 的值。我想看的是p=x:

(setq p 10987)

(write-line "p=")
(write p)

结果如下所示:

p=
10987

我想在同一行实现p=10987

【问题讨论】:

  • 你试过(write "p=")吗?
  • @psyFi -- 编辑时要小心;您的最后一次编辑从代码块中删除了(setq p 10897)。固定;)

标签: lisp common-lisp clisp


【解决方案1】:

write-line 无需与format 一起使用;只需单独使用format

请注意,setqsetf 用于现有变量的突变;它们不打算建立新的绑定,Common Lisp 规范没有为发布的代码定义任何行为。通常,实现会按照您的预期进行,但不要尝试在重要的代码中使用 setqsetf 定义新变量。在这种情况下,某些实现(例如 SBCL)会发出警告。

建立新绑定的常用方法包括defvardefparameterlet

CL-USER> (defparameter *p* 10987)
*P*
CL-USER> (format t "*p*=~A~%" *p*)
*p*=10987
NIL

这里defparameter 建立到*p* 的绑定; setfsetq 现在可用于更新此绑定。请注意,*p* 具有 耳罩,它们通常在 Common Lisp 中用于指示动态范围的变量。

format 的第一个参数指定输出目标。如果是t,那么输出到*standard-output*;如果nil 然后format 返回一个字符串结果。您还可以指定特定的流,或带有填充指针的现有字符串作为目标。对format 的调用中的~A 是美学指令,当您的目标是打印一个值供人们阅读时,它通常会执行您想要的操作。 ~% 指令导致format 发出换行符;这样就完全不需要使用write-line了。

另一种(更尴尬的)方法是使用princterpri

CL-USER> (let ((p 10987))
           (princ "p=")
           (princ p)
           (terpri))
p=10987
NIL

这里p 是一个局部范围的变量,因此没有耳罩。 princ 用于以人类可读的形式打印对象,但它不会发出换行符。神秘的 terpri 发出换行符。

【讨论】:

    【解决方案2】:
    (setq p 10987)
    (write-line (format nil "p=~a" p))
    

    【讨论】:

    猜你喜欢
    • 2017-09-03
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多