baitang36 发表于 2020-2-18 14:28:00

function和quote的区别

先看例子
(setqTT (EVAL (quote(LAMBDA (K ) (ALERT K ) ) ) ))
(TT "dd" )
编译以后是这样的:
Offset         0    1   23   45   6   7   8    9A    BC   DEF
00000000   0D 0A 20 46 41 53 34 2D46 49 4C 45 20 3B 20 44      FAS4-FILE ; D
00000010   6F 20 6E 6F 74 20 63 6861 6E 67 65 20 69 74 21   o not change it!
00000020   0D 0A 31 0D 0A 31 20 2420 24 0D 0A 31 32 33 20   11 $ $123
00000030   36 20 24 14 01 01 01 0032 00 32 22 2A 39 01 00   6 $   2 2"*9
00000040   55 01 00 02 00 64 64 5B54 54 00 45 56 41 4C 00   U    dd[TT EVAL
00000050   00 5B 4C 41 4D 42 44 4100 00 5B 4B 00 00 39 01    [LAMBDA[K9
00000060   00 5B 41 4C 45 52 54 0000 5B 4B 00 00 39 02 00    [ALERT[K9
00000070   39 03 00 01 01 43 00 0006 00 0A 01 5C 00 00 43   9    C      \C
00000080   00 00 01 00 0A 01 43 0600 00 00 1C 14 01 00 00         C         
00000090   00 09 05 00 0A 09 04 0034 00 07 35 01 03 00 03         45   
000000A0   0B 06 02 00 0A 09 01 0035 01 02 00 03 16 15 00         5      
000000B0   B6 81 1A 52 B3 0A 3B 6661 73 34 20 63 72 75 6E   ? R?;fas4 crun
000000C0   63 68 0A 3B 24 3B 41 322F 31 38 2F 32 30         ch ;$;A2/18/20
(setq tt (eval(function(lambda (k)    (alert k)   ))))
(tt "dd")
这两句编译后是这样:
Offset      0   1   2    3   4   5   6   7   8   9   A   B   C   D   E   F
00000000   0D 0A 20 46 41 53 34 2D46 49 4C 45 20 3B 20 44      FAS4-FILE ; D
00000010   6F 20 6E 6F 74 20 63 6861 6E 67 65 20 69 74 21   o not change it!
00000020   0D 0A 32 36 0D 0A 33 2024 14 01 01 01 00 09 02   263 $      
00000030   00 5C 00 00 18 03 00 0302 00 35 01 01 00 03 19    \      5   
00000040   01 00 16 24 0D 0A 31 3339 20 37 20 24 14 01 01      $139 7 $   
00000050   01 00 32 00 32 2A 2A 3901 00 55 01 00 02 00 64   2 2**9U    d
00000060   64 5B 54 54 00 45 56 414C 00 00 56 6B 77 6F 74   d[TT EVALVkwot
00000070   65 00 00 01 01 43 00 0006 00 0A 32 00 32 1A 2A   e    C   2 2 *
00000080   39 01 00 5B 41 4C 45 5254 00 4B 00 00 5C 00 00   9[ALERT K\
00000090   43 00 00 03 00 0A 5C 0000 32 00 5B 2D 6C 61 6D   C   \2 [-lam
000000A0   62 64 61 2D 00 00 3A 0143 06 00 01 00 1C 14 01   bda-: C      
000000B0   00 00 00 09 05 00 0A 5700 00 00 00 09 06 00 51          W       Q
000000C0   01 04 00 01 00 35 01 0300 03 0B 06 02 00 0A 09      5         
000000D0   01 00 35 01 02 00 03 1618 00 A9 8A FC F9 EA 3D   5       ?
000000E0   9D EE 0A 3B 66 61 73 3420 63 72 75 6E 63 68 0A    ?;fas4 crunch
000000F0   3B 24 3B 41 32 2F 31 382F 32 30                  ;$;A2/18/20
可以看出以下几点:
1.用quote时没有定义函数,蓝色字符为1,1,意思是函数部分只有一个字节长,含有一个符号。
   用function是定义了一个函数,-lambda-,函数内容紫红色部分,蓝色字符 26 3说明函数部分的长度是26个字节,含有3个符号。
2.用quote时 , (alert k) 是作为一个表来解释运行的。绿色的39 02 00说明这个表有两个元素。
3.用function时, alert和 k是两个独立的字符串。
结论:用quote时lambda没有编译成函数,是解释运行,速度慢。用function时,lambda被编译成了一个函数,可以进行优化,速度快。
所谓优化,就是可以快速、直接访问函数入口地址,不需要查找函数名对应的地址后再调用。
有的反编译,没有正确处理function,导致用了这个函数的程序不能被反编译。

highflybird 发表于 2022-7-14 11:39:00

确实如楼主所说,《乐筑天下》翻译的autolisp函数对这个函数说明如下:
function
通知 Visual LISP 编译器将参数作为内置函数进行链接和优化
(function symbol | lambda-expr)
function 函数与 quote 函数相同,但它将通知 Visual LISP 编译器将参数视为内部函数或用 defun 定义的函数,对其进行链接和优化。
由 function 引用的经过编译的 lambda 表达式加载到 Visual LISP IDE 时,将包含调试信息。
参数
symbol
命名函数的符号。
lambda-expr
如下格式的表达式:
(LAMBDA arguments {S-expression}* )
返回值
表达式的求值结果。
示例
下列代码中,Visual LISP 编译器不能优化被引用的 lambda 表达式:
(mapcar
'(lambda (x) (* x x))
       '(1 2 3))
向表达式中添加 function 函数后,编译器可对 lambda 表达式进行优化。例如:
(mapcar
   (function (lambda (x) (* x x)))
      '(1 2 3))

小菜123 发表于 2022-7-14 11:51:00


我上面那个语句,编译后看码似乎和楼主用function后是差不多的,肯定不是第一种结果
如果用list是不优化的,那么下面这个tt1命令怎么写才对呢?tt2是可以正常运行的
(defun ttfunc (func / )
   (eval func)
)
(defun c:tt1()
(ttfunc (function (lambda() (princ "\test"))))
)
(defun c:tt2()
(ttfunc (list (lambda() (princ "\test"))))
)

小菜123 发表于 2022-7-13 21:30:00

这么写,编译优化了吗?function定义的函数,似乎没法作为参数传递到其它函数中

(setqTT (list (LAMBDA ( ) (ALERT K ) ) ) )
(setq k "dd")
(eval TT)

caoliu023 发表于 2020-2-18 16:03:00

硬核技术贴

烟盒迷唇 发表于 2020-2-19 11:14:00

确实啊,出错在这个地方很多。

JUN1 发表于 2020-2-19 11:16:00


硬核技术贴

clinber 发表于 2020-2-19 17:52:00

意思是用function效率更高?我每次都是用的'(lambda(x) )   这个'是不是相当于quote

baitang36 发表于 2020-2-19 22:28:00


确实如此,function是为优化而生的

baitang36 发表于 2020-2-19 22:29:00


可以把出错的文件发给我,帮你研究解决方法
页: [1] 2
查看完整版本: function和quote的区别