3

我希望有人能帮我解决这个问题,因为我找不到任何有用的答案,而且我是 Lisp 的新手。

我要做的是测试一个元素的值,如果它是 1 则打印一些东西,否则打印空白字符。这在所有列表参数的值都为 1 时有效:

(defun print-lst (list)
  (format t "~%~a ~a ~a~%"
          (if (= (nth 0 list) '1)
              '¦)
          (if (= (nth 1 list) '1)
              'P)
          (if (= (nth 2 list) '1)
              '¦)))

所以输出是¦ P ¦。但是,如果列表中的第二个元素是 0,它会在那个位置打印 NIL,¦ NIL ¦我希望它打印一个空格¦ ¦(不仅仅是跳过那个字符¦¦,如果输出行的那个位置有一个空白字符很重要测试值不是 1)。

(if (= (nth 1 list) '1) 'P)如果条件不满足,是否有任何方法可以返回空白字符,或者是否有其他方法可以执行此操作?我希望我解释得很好。谢谢你。

4

4 回答 4

6

如果你想充分利用 的力量format,你可以使用格式条件和格式 GOTO 的组合。

像这样:

[1]> (format nil "~@{~:[<nothing>~;~:*~A~]~^ ~}" 1 2 nil 4 nil 6)
"1 2 <nothing> 4 <nothing> 6"

在您的情况下,这应该有效:

(format t "~&~@{~:[ ~;~:*~A~]~^ ~}"
        ...)

这通过执行以下操作来工作:

  1. ~&插入换行符,除非我们已经在行首。
  2. ~@{...~}迭代地处理参数。
  3. ~:[...~;...~]nil在 case和 non- case之间进行选择nil
  4. ~:*取消使用 . 使用的参数~:[...~]
  5. ~A输出正在处理的项目。
  6. ~^在最后一次迭代时从循环中逃脱(以免在最后一项之后输出过多的空间)。
于 2012-04-27T16:23:27.780 回答
5

If接受三个参数:condition、then-form、else-form;else-form 是可选的。此外,我会对文字字符使用文字字符语法。

(if (= (nth 0 list) 1)
    #\P
    #\Space)

文档:

于 2012-04-27T13:32:25.050 回答
0

反问:
您真的需要作为标识符的输出值(“某物”)还是字符串文字也可以工作(“某物”)?

如果第一个是真的:我想不可能使用空格作为标识符。
如果第二个为真:使用“|”、“P”和“”作为输出值

于 2012-04-27T13:49:04.007 回答
0

格式是等待吞噬粗心的野兽

也就是说,看起来您可能想在这里使用它的一些更高级别的指令。查看 Lisp Hyperspec 的格式化输出部分和PCL 的格式章节(具体来说,查看处理条件格式的部分)。

于 2012-04-27T14:41:59.143 回答