乐筑天下

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

[编程交流] 将不同的变量分配给

[复制链接]

7

主题

39

帖子

32

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 16:46:26 | 显示全部楼层 |阅读模式
大家好!
 
我已经搜索了一些关于这方面的信息,但没有什么非常接近我要找的。如果您有一个未知数量的元素列表,那么有人会如何为该列表中的每个元素分配不同的变量?比如说,你希望变量是p1,p2,p3。。。p(#列表的总元素)。有没有办法增加p并将其分配给列表中的下一个元素?
 
感谢您在advanced中的帮助!
 
起草人Joe
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 16:51:42 | 显示全部楼层
这是可行的,但有很多缺点:
 
 
  1. [b][color=BLACK]([/color][/b]setq i 0[b][color=BLACK])[/color][/b]
  2. [b][color=BLACK]([/color][/b]setq lst '[b][color=FUCHSIA]([/color][/b][color=#2f4f4f]"a"[/color] [color=#2f4f4f]"b"[/color] [color=#2f4f4f]"d"[/color] [color=#2f4f4f]"e"[/color][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]
  3. [b][color=BLACK]([/color][/b]foreach v lst
  4. [b][color=FUCHSIA]([/color][/b]set [b][color=NAVY]([/color][/b]read [b][color=MAROON]([/color][/b]strcat [color=#2f4f4f]"P"[/color] [b][color=GREEN]([/color][/b]itoa i[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] v[b][color=FUCHSIA])[/color][/b]
  5. [b][color=FUCHSIA]([/color][/b]setq i [b][color=NAVY]([/color][/b]1+ i[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
 
[列表]
  • 几乎不可能本地化这些变量
  • 检索数据也很困难:(eval(读取(strcat“P”(itoa i)))
  • 列表中不同的数据类型可能会造成严重破坏
    [/列表]
     
    首先
     
    HTH-David
  • 回复

    使用道具 举报

    7

    主题

    39

    帖子

    32

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 16:55:22 | 显示全部楼层
    谢谢大卫!
     
    我会试试你的代码。使用的数据类型是带有倒角的矩形多段线的坐标。
     
    我会把发生的事情报告给你。
     
    回复

    使用道具 举报

    7

    主题

    39

    帖子

    32

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 16:56:21 | 显示全部楼层
    我试过代码,只是有点不同,
    1. (setq z 0)
    2.    (foreach v coords
    3.      (set (read (strcat "P" (itoa z)) v)
    4.    (setq z (1+ z)))
    5.    )

     
    返回的内容如下:
    1. ; error: too many arguments
    2. _$

     
    我应该提到列表中的数据是第1个帖子中的点坐标。我猜想这一事实使这一点更加困难。
     
    谢谢你的努力,大卫,我很感激!
     
    回复

    使用道具 举报

    66

    主题

    1552

    帖子

    1514

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    325
    发表于 2022-7-5 17:00:14 | 显示全部楼层
    基于afralisp教程中的这一部分:
     
    您可以这样做:
    1. (defun test ( / args n vals a b c d e f )
    2. (setq args '(a b c d e f))
    3. (setq n 0)
    4. (repeat (length args)
    5.    (setq vals (cons n vals))
    6.    (setq n (1+ n))
    7. )
    8. (mapcar 'set args (reverse vals))
    9. (list a b c d e f)
    10. )
    1. _$ (test)
    2. (0 1 2 3 4 5)
    3. _$

     
    编辑:
    顺便考虑一下:
     
    1. (defun test ( / coords i p1 p2 p3 p4 p5 p6 p7 p8 p9)
    2. (setq coords '("First" "Second" "Third" "Fourth" "Fifth" "Sixth" "Seventh" "Eighth?" "Ninth?"))
    3. (repeat (setq i (length coords))
    4.    (set (read (strcat "P" (itoa i))) (nth (setq i (1- i)) coords))
    5. )
    6. (foreach x (list p1 p2 p3 p4 p5 p6 p7 p8 p9)
    7.    (print x)
    8. )
    9. (princ)
    10. )
    1. _$ (test)
    2. "First"
    3. "Second"
    4. "Third"
    5. "Fourth"
    6. "Fifth"
    7. "Sixth"
    8. "Seventh"
    9. "Eighth?"
    10. "Ninth?"
    11. _$

    但我同意D.Bethel的观点,即几乎不可能定位这些变量。
    回复

    使用道具 举报

    63

    主题

    6297

    帖子

    6283

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    358
    发表于 2022-7-5 17:03:25 | 显示全部楼层
    仔细查看以下内容:
     
    1. (set (read (strcat "P" (itoa z))) v)
    回复

    使用道具 举报

    7

    主题

    39

    帖子

    32

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 17:07:30 | 显示全部楼层
    谢谢你看我的问题Grrr&Thwart!我感谢你的意见。
     
    但是,由于我的列表由一个pline矩形的坐标组成,为了使用“read”函数,在我看来,我必须解构坐标列表,将每个元素的每个原子转化为字符串,然后用这些字符串重构元素,然后用新元素完成列表。从这里,我想另一个“foreach”函数将允许我处理坐标列表的解构和重建?我想我以前见过这么做。
     
    或者,在构造原始列表之前,将每个元素转换为字符串?
     
    我的想法正确吗?
     
    再次感谢各位!
    回复

    使用道具 举报

    26

    主题

    1495

    帖子

    20

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    118
    发表于 2022-7-5 17:09:16 | 显示全部楼层
     
     
    现在试试修改后的代码。它缺少1个括号(我应该测试最后一个片段)
    回复

    使用道具 举报

    63

    主题

    6297

    帖子

    6283

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    358
    发表于 2022-7-5 17:13:04 | 显示全部楼层
    试着这样做:
     
    1. (defun SetvariableToEachCoordinate (s / e i l)
    2. (if (and (eq (type s) 'ENAME)
    3.           (= (cdr (assoc 0 (setq e (entget s)))) "LWPOLYLINE")
    4.           (setq i 0)
    5.           )
    6.    (mapcar '(lambda (x) (set (read (strcat "P" (itoa (setq i (1+ i))))) x)
    7.               (setq l (cons (read (strcat "P" (itoa i))) l))
    8.               )
    9.            (mapcar 'cdr (vl-remove-if-not '(lambda (q) (= (car q) 10)) e))
    10.            )
    11.    )
    12. (reverse l)
    13. )

     
    1. (SetvariableToEachCoordinate  (car (entsel "\nSelect polyline :")))
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 17:17:56 | 显示全部楼层
    我强烈建议以列表格式保留和操作数据——毕竟,LISP是为列表处理而设计的。
     
    正如David在上文中所概述的,为每个项目元素使用单独的变量可能会导致几个问题。
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-13 14:18 , Processed in 0.377656 second(s), 72 queries .

    © 2020-2025 乐筑天下

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