本帖最后由 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 于 2025-7-22 15:09 编辑
从底层研究了一下,(princ)的返回值是as:*noval*,这是一个保留符号,可以用tranf转化成普通符号。它的值是本身,它的名是空字符串。
可以自己写一个没有回显的函数,只要让它返回as:*noval*

网友答:
试了一下,好像行不通。提示“; 错误: no function definition: TRANF
”网友答:
加载它后就有了
网友答: 高,一个字,真高手网友答: (set (princ)"我是一个神奇的变量")
(vl-symbol-value (princ))====>"我是一个神奇的变量"网友答: 海哥可以的()网友答:
关于princ 返回值这个、函数说明里面有提到、之前没注意、
今天看海哥一解释就懂了
网友答: 感谢海哥指点迷津网友答: 大海哥牛逼网友答: 太高级了~海哥牛网友答: 都是大佬,比我研究的深,我只用了setq 尝试获取 但是没有匹配到任何东西 那个空符号 我一直没搞清楚
昨天发现一个特别有意思的提问帖《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 于 2025-7-22 15:09 编辑
从底层研究了一下,(princ)的返回值是as:*noval*,这是一个保留符号,可以用tranf转化成普通符号。它的值是本身,它的名是空字符串。
可以自己写一个没有回显的函数,只要让它返回as:*noval*

- (load "c:/00/trf_9.fas")
- (tranf "as:*noval*")
- (defun c:tt ()
- (princ "hello world !")
- as:*noval*
- )
网友答:
baitang36 发表于 2024-9-5 22:59
从底层研究了一下,(princ)的返回值是as:*noval*,这是一个保留符号,可以用tranf转化成普通符号。它的值是 ...
试了一下,好像行不通。提示“; 错误: no function definition: TRANF
”网友答:
lxl304712346 发表于 2025-10-7 08:07
试了一下,好像行不通。提示“; 错误: no function definition: TRANF
”
加载它后就有了
网友答: 高,一个字,真高手网友答: (set (princ)"我是一个神奇的变量")
(vl-symbol-value (princ))====>"我是一个神奇的变量"网友答: 海哥可以的()网友答:
关于princ 返回值这个、函数说明里面有提到、之前没注意、
今天看海哥一解释就懂了

网友答: 感谢海哥指点迷津网友答: 大海哥牛逼网友答: 太高级了~海哥牛网友答: 都是大佬,比我研究的深,我只用了setq 尝试获取 但是没有匹配到任何东西 那个空符号 我一直没搞清楚