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)
)
好帖子支持 分析的很好 好帖子支持 分析的很好 感谢大侠翻译天书 这样说来,while相当好使。什么repeat delay mapcar 都可用它替代,是万能的。 自贡黄明儒 发表于 2022-4-19 13:57
这样说来,while相当好使。什么repeat delay mapcar 都可用它替代,是万能的。
确实如此,本质上都是if 和goto 学习了原来是这样 学习学习,感谢分享! 函数大全上看不明白这下就明白多了感谢大佬 gzsod 发表于 2022-5-27 13:42
函数大全上看不明白这下就明白多了感谢大佬
你喜欢就好
页:
[1]
2