LISP 打印到同一行

LISP Printing to Same Line

另一个 LISP 问题,我目前正在尝试编写一个函数,它将 return 一个三角形,其大小将取决于用户的输入

例如:7

aaaaaaa 
aaaaaa 
aaaaa 
aaaa 
aaa 
aa 
a 

例如:-3

aaa 
 aa 
  a

我已经编写了正整数部分的代码,至少是逻辑,但是我 运行 遇到了障碍。我似乎无法让循环在同一行打印字母。每次循环迭代时,它都会转到下一行。有没有什么办法解决这一问题?我的实现中的任何 comments/suggestions 也将不胜感激,我是 Lisp 的新手。非常感谢大家!你会在下面找到我的代码

(defun triangle (k) 
    (if (or (= k 1) (= k -1))
        (print 'a)) 
        (if (> k 0) 
           (loop for n from 0 to k
                 do (print 'a)) 
                (triangle (- k 1))))

        
(print (triangle 2))

的确,print 打印了一个换行符。 princ 没有。

要进一步控制打印内容的方式,可以使用 format。它适用于以 ~ 开头的指令。因此,~a(或~A)从美学角度打印作为参数给出的对象。 ~& 打印换行符。

(format t "~a~&" 'a)

t 用于 *standard-output*

https://lispcookbook.github.io/cl-cookbook/strings.html#structure-of-format

此 link 还解释了如何将字符串向右或向左对齐,您可能需要这样做(如果您走格式路线)。

您可以缩短代码。有make-string count :initial-element character可以代替循环。一个字符写成#\a.

此外,只有当 k > 0 (zerop) 时,您才可以递归调用 triangle。有了这个和 (format t "~a~&" (make-string k :initial-element #\a)),我的版本只有一次调用打印函数,更少的“if”机制:

(defun my-triangle (k)
   (format t "~a~&" (make-string k :initial-element #\a))
   (unless (zerop k)
     (my-triangle (decf k))))