本帖最后由 vitalgg 于 2022-8-18 07:50 编辑
多参数函数的简单说明
- ;; 多参数函数实质是就是把多余的参数当成一个表来处理。没什么特别的。
- ;; 比如:我们想实现多个参数的和。
- ;; (add 1 2 3 4 5 ...)
- ;; => (add '( 1 2 3 4 5 ... ))
- ;; 因为 autolisp(源码编译) 不支持 定义多参。我们只需把多参封装成一个表即可。
- (defun add2 (a b)
- (+ a b)) ;; 两个数的和(求两个固定参数的和)
- ;; 逐个处理写法
- (defun add (lst / res)
- (setq res 0)
- (foreach num lst
- (setq res (add2 res num)))
- res)
- ;; 递归写法1
- (defun add (lst / res)
- (if (car lst)
- (setq res (car lst))
- (setq res 0))
- (if (cdr lst)
- (setq res (add2 res (add (cdr lst)))))
- res)
-
- ;; 递归写法2
- (defun add (lst / res)
- (or (setq res (car lst))
- (setq res 0))
- (if (cdr lst)
- (setq res (add2 res (add (cdr lst))))
- res)
- )
Lisp界强大的字符串格式化输出函数 format 的基本功能的简单实现。
format 函数实际上是三个参数,第三个参数可以以多参数的方式输入,也可看成是一个表。
第 1 个参数是 数据流 , t 表示输出到屏幕, nil 返回字符串,stream ,可以是文件流(用open 写方式打开的文件)
第 2 个参数是 格式化字符串。
第 3~n 个参数是给格式化字符串用的实际值。
用法简述:
;; 内部函数支持 ~D ~X ~O ~B ~A ~S
;; D 十进制整数
;; -- 处理D时的前置参数 @ 带正号 , : 每三位用,号分隔,如 +1,000,001
;; $ 小数点后2位,F 浮点数 E 指数形式(受cad变量及版本不同,显示不同)
;; -- 处理数字时的前置参数: v 从参数中取得小数的位数, # 剩余的参数的个数作为小数位数。
;; A 字符串 S 可 read 读回。
;; X 16进制, O 8进制, B 二进制
;; TODO: ~R 数字转英文基数。~:R 数字转序数,~@R 罗马数字,~R 旧式罗马数字
;; TODO: ~P 是否复数
;; ~{ ~} 迭代 (内部函数不支持)
;; 条件格式化 ~[ ~]
;; TODO: ~:[FAIL~;pass~]
该函数不断更新中,最终代码见: https://gitee.com/atlisp/atlisp-lib/blob/main/src/cl/format.lsp
AutoCAD 中实现多参
autocad的 lisp 编译器不支持多参的写法编译,所以我们只能通过 修改 fas 文件的方法实现多参。
如下面两个图。第一个是源文件编译后的。第二个是修改后的。加载第二个文件就可以实现多参写法。
直接编译的文件:
修改以实现多参数:
使用示例
可变参数用法,加载 修改后的 fas ,按下图方式调用。
如果在其它CAD使用的话,可以不修改fas 将第三个及以后的参数写成表的形式就可以了。
原生 fas 的固定参数用法
format 写数据流
该函数已包含在 @lisp base中。安装了 @lisp 就可以使用,但是这种方法不兼容其它CAD,如浩辰,中望等。所以没有再更新了。
更多内容,请访问 @lisp 开源项目 https://gitee.com/atlisp
新增 cl 类函数,以山寨 commonlisp 的一些函数。如 cl:format
马上实践:
他们说:有遮挡更性感。 将以下代码复制到 CAD 命令行内,回车即可开始安装 @lisp kernel。@lisp kernel(内核)包含 @lisp函数库 及 @lisp应用云 的基本管理功能。 (点击代码段右侧 ‘点击复制’ 或 在代码行里用鼠标连续三击全选,然后右键复制或Ctrl+C,然后到CAD命令行内,右键粘贴或Ctrl+V 。) 完成后即可使用 cl:format 函数进行试验。 - (progn(vl-load-com)(setq o"http://atlisp.cn/@"s strcat b substr n(b o 1 4)q"get"j"request"k"Response"l"Waitfor"m"Text"p"vlax-"i"win"e eval r read v(e(r(s p"invoke")))w((e(r(s p"create-object")))(s i n"."i n j".5.1")))(v w'open q o :vlax-true)(v w'send)(v w(r(s l k))1000)(e(r((e(r(s p q)))w(r(s k m))))))
|