敖沧海 发表于 2025-8-22 11:02:01

print\princ\prin1内容的区分

本帖最后由 敖沧海 于 2025-8-22 11:03 编辑

;欢迎大家补充或者提建议,让我更能理解他们的不同(defun c:t0 ()
(setq a 123 b '(a))   ;只显示了(A)把整数123赋予a 把表(a)赋予b
)

(defun c:t1 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b
(princ)    ;什么都不显示
)

(defun c:t2 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b
(princ a)    ;显示为123123前者为打印值 后者为返回值
)

(defun c:t3 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b
(princ a)    ;显示为123123前者为打印值 后者为返回值
(princ)    ;显示为123
)

;此时把(princ)移到函数外部,结果如下
(defun c:t4 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b
)
(princ)    ;输入命令后才显示了(A),但与上面不同的是加载后不显示c:t4

(defun c:t5 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b   
)
(princ a)   ;不输入命令直接显示为123123前者为打印值 后者为返回值输入T5,显示(A)

(defun c:t6 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b
(princ a)    ;显示为123123前者为打印值 后者为返回值
   
)
(princ) ;什么都不显示输入T6,显示为123123

(defun c:t7 ()
(setq a 123 b '(a))   ;把整数123赋予a 把表(a)赋予b
   
)
(princ a)    ;显示为123123前者为打印值 后者为返回值
(princ) ;显示123输入T7,显示为(A)

;最后(princ)替换为(prin1),结果一样
;最后(princ)替换为(print),结果T2 T5 T6在123123中加了一个空格
;故不区分三个命令。


edata 发表于 2025-8-22 12:14:57

_$ (princ "这是\n换行")
这是
换行"这是\n换行"
_$ (prin1 "这是\n换行")
"这是\n换行""这是\n换行"
_$ (print "这是\n换行")

"这是\n换行" "这是\n换行"
_$
princ可以输出控制符,比如换行,
prin1是原样输出,双引号都在,
print也是原样输出,只是额外输出了一些字符,前面命令空了一行,其次和后面的返回值也有一个空格.

所有函数执行都有返回值,defun也不例外,所以执行defun的函数也会返回最后的表达式的值.
通常在不需要返回值的defun使用(princ)来输出一个空返回.

qifeifei 发表于 2025-8-22 11:14:37

下载看看 怎么回事

moranyuyan 发表于 2025-8-23 07:45:04

谢谢分享:handshake

aws 发表于 2025-8-23 08:05:32

edata 发表于 2025-8-22 12:14
_$ (princ "这是\n换行")
这是
换行"这是\n换行"


原来如此,我寻思,为什么每个程序都要加个princ呢,不加就会输出两遍结果,原来是defun也有返回值,这就合理了
页: [1]
查看完整版本: print\princ\prin1内容的区分