(princ)之一个神奇的变量名:“空”
本帖最后由 tryhi 于 2024-9-4 09:40 编辑昨天发现一个特别有意思的提问帖《lisp代码最后都写一句”(princ)“,它的作用是什么?》,仅仅讨论一个(princ)居然跟出了三十多个回复,可惜最后提问者依然不明白,单独开贴引申一下,
长久以来,绝大多数人都认为(princ)没有返回值,为什么会没有返回值?不觉得奇怪吗?答案其实是有返回值的,返回值是一个符号(亦或通俗的称为变量名,如同'a 'b 'abcd之类),这个符号没有名字,称为空符号。
看一下面的代码,乍一看似乎没有使用任何变量,但是你再细看,会发现(princ)居然就是一个变量名,正常变量都是有名字的,但是这个变量它没有名字
(set (princ)"我是一个神奇的变量")
(princ(strcat"这是一个非常特别的变量,它的名字为空:它的值为:"(eval(princ))))
第一句代码是为一个空名变量进行赋值,
第二句代码是使用这个变量,从而输出"这是一个非常特别的变量,它的名字为空:它的值为:我是一个神奇的变量"
可以用(vl-symbol-name(princ))直观的看到它的“名字”
还可以拿它来作为函数,简直不要太神奇
;;定义空名函数
(set (princ)(lambda(a)(princ"\n这是一个空名函数\n")(1+ a)))
;;调用空名函数
((eval(princ))5) 本帖最后由 baitang36 于 2024-9-5 23:05 编辑
从底层研究了一下,(princ)的返回值是as:*noval*,这是一个保留符号,可以用tranf转化成普通符号。它的值是本身,它的名是空字符串。
可以自己写一个没有回显的函数,只要让它返回as:*noval*
(load "c:/00/trf_9.fas")
(tranf "as:*noval*")
(defun c:tt ()
(princ "hello world !")
as:*noval*
)
关于princ 返回值这个、函数说明里面有提到、之前没注意、
今天看海哥一解释就懂了
(set (princ)"我是一个神奇的变量")
(vl-symbol-value (princ))====>"我是一个神奇的变量" 高,一个字,真高手 海哥可以的() 感谢海哥指点迷津 大海哥牛逼 太高级了~海哥牛 都是大佬,比我研究的深,我只用了setq 尝试获取 但是没有匹配到任何东西那个空符号 我一直没搞清楚
页:
[1]
2