- 积分
- 3521
- 明经币
- 个
- 注册时间
- 2010-9-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2020-10-1 18:11:34
|
显示全部楼层
本帖最后由 wyl219 于 2020-10-1 18:28 编辑
(#<SUBR @0000000029078a48 <> 70 20) 这种是列表#<SUBR @000000002e938a48 <> 这种才是函数.
如果是提前赋值,就想你示例的函数那样,那直接把list去掉,tj保存判断后的布尔值就好.就像下面这样:
(setq L 70 D 20)
(setq tj (< L D))
(setq ans (cond (tj
"Yes")
(T
"No")
))
如果是想提前设定这个函数,再后面多次修改调用,可以把他写成函数.类似这样
(defun tj() (< L D))
(setq L 70 D 20)
(setq ans (cond ((tj);这里tj是个函数,要用括号括上
"Yes")
(T
"No")
))
如果tj的内容比较简单,可以考虑用lamba函数,就像这样.
(setq tj (lambda () (< L D)))
(setq L 70 D 20)
(setq ans (cond ((tj);这里和上面一样,要用括号括上
"Yes")
(T
"No")
))
还有一种方式,用read函数配合eval函数,注意tj保存的是字符串而不是列表.
(setq tj "(< L D)") ;这里没有list,否则后面会当成一个list函数
(setq L 70 D 20)
(setq ans (cond ((eval (read tj))
"Yes")
(T
"No")
))
注意,还有一种方式,即只使用eval不用read,像下面这样:
(setq L 70 D 20)
(setq tj (list < L D))
(setq ans (cond ((eval tj)
"Yes")
(T
"No")
))
单纯这样运行是没问题的,但是tj里保存的实际是 (< 70 20)这个列表,即用70和20代替L和D,然后在后面执行,如果之后修改L和D,对后面的执行没有影响的.因此tj里保存的是常量而非变量.
而用read函数,里面保存的是L和D的字符串,执行的时候才会调用L和D的值.
以上几种方式,lamba是更为正统的方式.
另外,可以猜一下下面的代码的输出值,如果弄清楚了,可能对你现在的疑惑有所帮助.
(defun tj() nil);一个返回值为nil的函数
(princ tj) ;打印tj变量保存的内容
(princ (tj)) ;打印tj函数的返回值
|
评分
-
查看全部评分
|