baitang36 发表于 2022-4-19 08:58:04

foreach指令剖析

本帖最后由 baitang36 于 2022-4-19 09:00 编辑

lsp有foreach指令,但fas中是没有这个指令的,它是 由一组指令来实现这个功能的,是怎么实现的呢?
先做个试验,(foreach n '(2 3 4) (print n))
把这一句编译后解码
Offset      01234567   89ABCDEF
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 30 20   11 $ $120
00000030   35 20 24 14 01 01 01 0032 00 32 3F 2A 39 01 00   5 $   2 2?*9
00000040   5B 50 52 49 4E 54 00 4E00 00 32 02 32 03 32 04   [PRINT N2 2 2
00000050   39 03 00 01 01 43 00 0005 00 0A 01 5C 00 00 43   9    C      \C
00000060   00 00 01 00 0A 01 43 0500 00 00 1C 14 01 00 00         C         
00000070   00 09 04 00 0A 09 03 005D 00 00 09 02 00 01 18         ]      
00000080   03 00 01 5C 00 00 67 1C00 00 00 0A 5C 00 00 28      \g   \(
00000090   06 02 00 5C 00 00 29 5D00 00 03 02 00 35 01 01      \)]   5
000000A0   00 03 57 DC FF FF FF 1901 00 16 16 00 67 57 36   W?

用到的符号:
03 / '(2 3 4 )
02 / N
01 / PRINT
指令字节码及解释:
09 03 00; '(2 3 4 )
5D 00 00 ;将'(2 3 4 )放入局部变量   (setq var1 '(2 3 4))
09 02 00   ; N
01 18 03 00 ;绑定一个局部变量
01 ;nil
loc_1:
5C 00 00            ;局部变量 var1
67 1C00 00 00;if指令,如果var1为空,转到解除绑定、结束
0A;NIL
5C 00 00;局部变量var1
28      ;car
06 02 00 ;(SETQ N (car var1))
5C 00 00 ;局部变量var1
29       ;cdr
5D00 00   ;(setq var1(cdr var1))
03 02 00 ;N
35 01 01 00 03 ;(PRINT N)
57 DC FF FF FF   ;goto loc_1
1901 00       ;解除绑定
16               ;结束   
结论:
(foreach n '(2 3 4) (print n))相当于:
(setq var1 '(2 3 4))
(while var1
(SETQ N (car var1))
(setq var1(cdr var1))
(print N)
)      


f4800 发表于 2022-4-19 09:40:32

好帖子支持      分析的很好

zghmaya 发表于 2022-4-19 09:52:16

好帖子支持      分析的很好

紫苏炒黄瓜 发表于 2022-4-19 13:19:58

感谢大侠翻译天书

自贡黄明儒 发表于 2022-4-19 13:57:32

这样说来,while相当好使。什么repeat delay mapcar 都可用它替代,是万能的。

baitang36 发表于 2022-4-19 19:10:57

自贡黄明儒 发表于 2022-4-19 13:57
这样说来,while相当好使。什么repeat delay mapcar 都可用它替代,是万能的。

确实如此,本质上都是if 和goto

qianzj 发表于 2022-4-20 12:11:46

学习了原来是这样                        

明_明 发表于 2022-4-20 20:58:15

学习学习,感谢分享!

gzsod 发表于 2022-5-27 13:42:29

函数大全上看不明白这下就明白多了感谢大佬

baitang36 发表于 2022-5-27 14:02:40

gzsod 发表于 2022-5-27 13:42
函数大全上看不明白这下就明白多了感谢大佬

你喜欢就好
页: [1] 2
查看完整版本: foreach指令剖析