明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1438|回复: 10

[经验] foreach指令剖析

  [复制链接]
发表于 2022-4-19 08:58 | 显示全部楼层 |阅读模式
本帖最后由 baitang36 于 2022-4-19 09:00 编辑

lsp有foreach指令,但fas中是没有这个指令的,它是 由一组指令来实现这个功能的,是怎么实现的呢?
先做个试验,(foreach n '(2 3 4) (print n))
把这一句编译后解码
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 2D  46 49 4C 45 20 3B 20 44      FAS4-FILE ; D
00000010   6F 20 6E 6F 74 20 63 68  61 6E 67 65 20 69 74 21   o not change it!
00000020   0D 0A 31 0D 0A 31 20 24  20 24 0D 0A 31 32 30 20     1  1 $ $  120
00000030   35 20 24 14 01 01 01 00  32 00 32 3F 2A 39 01 00   5 $     2 2?*9  
00000040   5B 50 52 49 4E 54 00 4E  00 00 32 02 32 03 32 04   [PRINT N  2 2 2
00000050   39 03 00 01 01 43 00 00  05 00 0A 01 5C 00 00 43   9    C      \  C
00000060   00 00 01 00 0A 01 43 05  00 00 00 1C 14 01 00 00         C         
00000070   00 09 04 00 0A 09 03 00  5D 00 00 09 02 00 01 18           ]      
00000080   03 00 01 5C 00 00 67 1C  00 00 00 0A 5C 00 00 28      \  g     \  (
00000090   06 02 00 5C 00 00 29 5D  00 00 03 02 00 35 01 01      \  )]     5  
000000A0   00 03 57 DC FF FF FF 19  01 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 1C  00 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  
5D  00 00   ;  (setq var1(cdr var1))
03 02 00 ;N
35 01 01 00 03 ;(PRINT N)
57 DC FF FF FF   ;goto loc_1
19  01 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)
)        



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
xshrimp + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-4-19 09:40 | 显示全部楼层
好帖子  支持      分析的很好
发表于 2022-4-19 09:52 | 显示全部楼层
好帖子  支持      分析的很好
发表于 2022-4-19 13:19 | 显示全部楼层
感谢大侠翻译天书
发表于 2022-4-19 13:57 | 显示全部楼层
这样说来,while相当好使。什么repeat delay mapcar 都可用它替代,是万能的。
 楼主| 发表于 2022-4-19 19:10 | 显示全部楼层
自贡黄明儒 发表于 2022-4-19 13:57
这样说来,while相当好使。什么repeat delay mapcar 都可用它替代,是万能的。

确实如此,本质上都是if 和goto
发表于 2022-4-20 12:11 | 显示全部楼层
学习了  原来是这样                          
发表于 2022-4-20 20:58 | 显示全部楼层
学习学习,感谢分享!
发表于 2022-5-27 13:42 | 显示全部楼层
函数大全上看不明白  这下就明白多了  感谢大佬
 楼主| 发表于 2022-5-27 14:02 | 显示全部楼层
gzsod 发表于 2022-5-27 13:42
函数大全上看不明白  这下就明白多了  感谢大佬

你喜欢就好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 17:24 , Processed in 0.457444 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表