Bill Tillman 发表于 2022-7-5 15:28:01

口齿不清技能

尝试在这里为一个新项目清理一些代码,并了解我对LISP的使用有多生疏。所以,在我开始真正的问题之前,有人能告诉我为什么这样做有效吗

(defun c:sk (/ dxf ent)
(defun dxf (code ent)(cdr (assoc code (entget ent))))

(if (and (setq ent (car (entsel "\nSelect an Attributed Block: ")))
          (eq "INSERT" (dxf 0 ent))
          (= 1 (dxf 66 ent)))

   (while (not (eq "SEQEND" (dxf 0 (setq ent (entnext ent)))))
   (princ (strcat "\n\nAtt_Tag:" (dxf 2 ent) "\nAtt_Value: " (dxf 1 ent)))))

(princ))
但这不是
唯一的区别是,在不工作的版本中,第二个defun在第一个defun之外。我以前在主defun的内部看到过这样的代码,但从未真正理解过。

Lee Mac 发表于 2022-7-5 15:57:38

从为c:sk函数声明的局部变量列表中删除dxf,第二个变量也会起作用;将符号dxf声明为本地符号后,在c:sk函数的范围内为该符号分配新内存,符号在评估c:sk函数后恢复其先前的值。

Grrr 发表于 2022-7-5 16:19:26

李描述的代码示例:

(defun C:test ( / fun )
(defun fun ( msg ) (alert msg))
(fun "Im working with the localised 'fun'!")
(princ)
)


(defun C:test ( / )
(fun "Im working with the global 'fun'!")
(princ)
)
(defun fun ( msg ) (alert msg))


(defun C:test ( / fun )
(fun "Im expecting the localised 'fun' you declared and no, I won't use the global one!")
(princ)
)
(defun fun ( msg ) (alert msg))

Lee Mac 发表于 2022-7-5 16:32:43

这也可以帮助您理解范围的概念:
5在加载并使用(foo)运行上述操作之前,查看是否可以预测输出
页: [1]
查看完整版本: Lisp程序技能