tryhi 发表于 2024-9-4 02:30:28

(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 22:59:24

本帖最后由 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*
)


xiaocainiao 发表于 2024-9-4 08:29:57



关于princ 返回值这个、函数说明里面有提到、之前没注意、
今天看海哥一解释就懂了

自贡黄明儒 发表于 2024-9-4 07:28:02

(set (princ)"我是一个神奇的变量")
(vl-symbol-value (princ))====>"我是一个神奇的变量"

crtrccrt 发表于 2024-9-4 05:35:14

高,一个字,真高手

Bao_lai 发表于 2024-9-4 08:25:47

海哥可以的()

czb203 发表于 2024-9-4 08:55:53

感谢海哥指点迷津

664571221 发表于 2024-9-4 10:55:38

大海哥牛逼

magicheno 发表于 2024-9-4 10:56:25

太高级了~海哥牛

muwind 发表于 2024-9-5 22:49:57

都是大佬,比我研究的深,我只用了setq 尝试获取 但是没有匹配到任何东西那个空符号 我一直没搞清楚
页: [1] 2
查看完整版本: (princ)之一个神奇的变量名:“空”