乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 87|回复: 11

[编程交流] 使循环返回结果

[复制链接]
dak

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:31:38 | 显示全部楼层 |阅读模式
大家好,
 
只是尝试将点列表传递给“pline”命令。
问题是,虽然在例程中计算,但点数最初是未知的。
以下代码(以smth开头)进化出已知数量的点。
  1. (defun c:pltest6 ()
  2. (setq pts (list '(0 0) '(0 10) '(10 10) '(10 20) '(20 20) '(20 30) '(30 30)))
  3. (setq ptqty 7)
  4. (setq ptnum 0)
  5. (command "pline"
  6.         (car pts)
  7.         (pt_retr pts)
  8.         (pt_retr pts)
  9.         (pt_retr pts)
  10.         (pt_retr pts)
  11.         (pt_retr pts)
  12.         (pt_retr pts)
  13.         ""
  14. )
  15. )
  16. (defun pt_retr (lst)
  17. (setq ptnum (1+ ptnum))
  18. (repeat ptnum
  19.         (setq lst (cdr lst))
  20. )
  21. (setq pt (car lst))
  22. )

Repeat/foreach不执行,因为它们返回上一次迭代的值。。
现在我的Q是,
是否可以修改上述代码以使用循环,而不是重复同一行(此外,次数未知),
或者其他更愿意修复任务的方法?
 
提前感谢您,
Dmitro公司
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 06:41:57 | 显示全部楼层
  1. (defun c:FOO (/ _FOO pts)
  2. (defun _FOO (pts /)
  3.    (command "._pline") (foreach pt pts (command pt)) (command)
  4. )
  5. (if (setq pts '((0 0)(0 10)(10 10)(10 20)(20 20)(20 30)(30 30)))
  6.    (_FOO pts)
  7. )
  8. (princ)
  9. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:43:44 | 显示全部楼层
例子:
  1. (defun c:pline-example ( / lst )
  2.    (setq lst '((0 0) (0 10) (10 10) (10 20) (20 20) (20 30) (30 30)))
  3.    (apply 'command (append '("_.pline") lst '("")))
  4.    (princ)
  5. )
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 06:51:36 | 显示全部楼层

  1. (command "_pline")(mapcar 'command pt)(command "_cl")

为了使其关闭,当然osmode在之前设置为0
回复

使用道具 举报

dak

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:53:33 | 显示全部楼层
BlackBox、Lee Mac和fixo、,
 
非常感谢你。
我知道我需要再练习1000次才能习惯lisp。
如果你发现我的问题有问题,很抱歉。
 
当做
Dmitro公司
 
P、 是否存在将LISP与其他语言进行比较的论坛/线程?
E、 g.“这是C/Pascal/Basic代码——这就是我们在LISP中的实现方式”。
回复

使用道具 举报

2

主题

389

帖子

387

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 07:03:34 | 显示全部楼层
你可能应该在另一个帖子里问这个问题。但请注意,AutoLISP和Visual LISP并不是真正的LISP,而是专门用于AutoCAD的语言。此外,LISP不是同一种语言,因此如果你想“正确”地使用它,最好不要对这类语言考虑太多。顺便说一句,有趣的是,没有人提到while将是重复的替代循环函数,当单步通过可变数量的项目时,或当数量不重要时。这可能是因为AutoLISP与您提到的其他语言的工作方式不同吗?
回复

使用道具 举报

2

主题

389

帖子

387

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 07:06:55 | 显示全部楼层
关于OSMODE的观点很好!为什么不直接应用而不是mapcar?
或者你刚刚展示了还有另一个功能选项?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:13:57 | 显示全部楼层
 
这种比较没有具体的地方,但想了解如何用不同的语言完成类似的任务是合乎逻辑的。。。在AutoCAD方面,我认为最常见的是Visual LISP与。NET(据我所见,主要是C语言,但也有一些VB.NET和F语言)。。。我猜想,既然VBA 7.1得到了支持,您可能会看到更多的VBA。
 
顺便说一句,只有当我擅长编写LISP时,我才跃入了语言的最深处。NET API,自学C#&VB。。。就在那时,我真正意识到LISP代码是多么优雅,尽管它的性能受到了影响,它完全没有事务、文档锁、静态字段、权限等等。。。。这让我比想象中更欣赏LISP。
 
如果你真的有这样的想法,“我在LISP中是这样做的,我怎么能在中做同样的事情呢。净?”等等,在中发布一个线程。NET论坛,包括你的LISP代码,我们会帮助你。
 
干杯
回复

使用道具 举报

dak

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:16:05 | 显示全部楼层
不可更改,
 
你说得对,这当然不可能;涉及6号岗位
 
我的问题是,实际上我不知道如何将循环“螺旋”到“pline”命令。这是因为你过去用一些语言编写了很多代码,你已经采用了一些特定的技巧。在本例中,我总结了列表函数规则(当我提出这个线程时,这对我来说并不明显)。
 
当做
Dmitro公司
回复

使用道具 举报

2

主题

389

帖子

387

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 07:24:10 | 显示全部楼层
事实上,直到我看到有人这么做,我才明白,可以将一个命令分解为多个对命令的调用。这对我来说是一个很大的启示。FWIW,下面是一个如何使用while的简单示例:
  1. (defun C:Q (/ P)
  2. (command "_.PLINE")
  3. (while
  4.    (setq P (getpoint))
  5.    (command P)
  6. )
  7. (command "")
  8. )
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 15:09 , Processed in 0.396273 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表