Owen W 发表于 2022-7-6 11:32:06

LISP函数封装

这是我在这里的第一篇帖子,虽然我已经阅读论坛帖子很长时间了。非常感谢你们帮助我解决了许多LISP编程问题!我非常欣赏论坛成员所表现出的专业水平(和耐心)。
 
我的问题是关于嵌套函数的正确格式。我们有一个企业。与我们的企业一起加载的LSP文件。崔。它包含了很多东西,是多年来拼凑在一起的,有很多奇怪的代码片段。我正在清理它,并更新代码,使其更加紧凑和高效。许多较大的例程调用其他例程来提供操作所需的参数。几乎所有这些函数都无法声明局部变量。我想切换到局部变量,但我想要一些关于最佳方法的指导。
 
是否可以(或智能)在较大的函数中声明子程序函数?如果是这样,在各种函数之间传递的变量是否应该在较大函数的顶层声明为局部变量?
 
我想我要问的是,如何避免使用所有全局变量,而不必立即重新编写所有代码,将各种子程序的内容放入需要它们的函数中。例如,我有一个例程,插入图形边框,并填写一些图形信息。有一个子例程可以从用户列表中查找其首字母。它使用的变量都是全局的,因为函数当前没有嵌套。由于边界插入函数是唯一使用该子例程的函数,因此我可以安全地将该代码与较大的函数集成,但这有点缓慢和费力。是否应该将该子例程移到较大的子例程中,然后在顶级函数声明中将变量(包括子例程中的变量)声明为局部变量,从而将其作为全局变量删除?。我希望这个问题有意义眨眼:
 
非常感谢。
-欧文

JohnM 发表于 2022-7-6 13:00:45

阅读代码并试图找出他们的想法总是很困难和乏味的。在大多数情况下,可以嵌套defun并在主defun中kill声明其变量。但你真的不想有几个嵌套的defuns,因为它使故障排除变得困难。我喜欢把我的子程序分开,我不共享变量。
在你开始改变事情之前,复制一份程序。
首先,我将打开我的lisp控制台并创建一个项目,以便更轻松地处理该程序的所有文件。然后将所有相关文件加载到控制台中。然后逐个单击变量并使用查找功能,在“查找”对话框中选择“在项目中查找”选项并选择项目名称。这将显示该变量在多个文件中的每次出现。然后,您可以判断变量的分散程度,并决定如何处理它。
您可以在主函数声明区域中声明所有变量,包括子函数变量,并查看程序是否正常工作。想要尽快消除变量的原因是内存问题。变量使用内存直到释放。如果是一个有数百个变量的大程序,最好杀死a.s.a.p。但是一个有20个变量的小程序最终杀死所有变量并没有什么大不了的。
如果子函数包含主函数或其他函数中使用的变量,则应考虑对其进行更改。当调用子函数时,它应该返回您的答案,然后您有机会在程序继续确保其正确之前检查答案。
单向的简单示例:
 

(defun c:test1 ( / a b c)
(setq a (getint "enter a number"));_user number
(setq b (getint "enter another number"));_user number
       (setq c (addnum a b));_call to sub passing 2 vars
(if c (alert (strcat "Your Total Is "(itoa c))));_check it and display result
(princ)
);_defun
(defun addnum (aug1 aug2 / x ret)
    (setq x (+ aug1 aug2));_add 2 numbers
   (setq ret (* x 3));_times number by 3
   ret   ; i like to do it this way to make sure my return is the last thing processed by the sub
);_defun
页: [1]
查看完整版本: LISP函数封装