lisp几种数组定义较全

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

lisp几种数组定义较全

1.首先,定义如下简单的子例程:atob (DEFUN ATOB(A NO / L)

;** e.g. A="A" NO=1 THEN B=A1 ** (SETQ L (ITOA NO))

(SETQ B (STRCAT A L)) (READ B) );END ATOB-DEFUN 有了这个小东西

,接下来的就好办了。举个例子,有个表list_a ,里面有N个数据,而且随每次程序执行的不同,N的值不同。要建立一个数组A (n),n=1~N

,每个 A(n)等于对应的表中的数据,可以这样实现:

(setq list_no (length list_a)) (setq cur_no 0) (while (< cur_no list_no)

(setq n (+ 1 cur_no)) (set (atob "A" n) (nth cur_no list_a))

(setq cur_no (+ 1 cur_no)) );; end while

需要使用A(n)的时候这样用:(setq the_val (eval(atob "A" n)))

这个时候得到的the_val就是所需要的A(n)值。

2.设一个表为连续的数组存储地址

我设计了如下取二维数组的程序请大家指正!

(a b c d e g g g g g g g g g g g g g g g g)

;;;二维数组的取操作

;;;如有数组m(5,6) 取m(1,4) 输入(drr 5 6 1 4 dl) dl为数组表

(defun drr (b c e f dl / n)

(setq b (* b c))

(setq n (length dl))

(cond ((> n b) (setq e (+ (* (- e 1) c) e))

(nth e dl)

)

((= n b) (setq e (+ (* (- e 1) c) (- f 1)))

(nth e dl)

)

);;;cond

);;;defun

注意:表中数据可以大于数组确定的数据数量,这样我可以假设

任何表为一数组!

5.6 在 AutoLISP 中定义和使用多维数组

“表”是 AutoLISP 中最常用的数据库纪录类型,也是它最善于操作的、特有的数据类型。利用“表的生成和处理”有关函数,可以定义通常概念中的多维数组,可利用“表的查询和检索”的有关函数,可对这个表进行方便快速的数据提取。以下的模拟程序参见T ools.LSP:(Defun C:DataIO ()

(PrinC "\n三维数组建立...")

(SetQ l nil

x0 (GetInt "\nX 维数: ")

y0 (GetInt "\nY 维数: ")

z0 (GetInt "\nZ 维数: ")

x 1 y 1 z 1 vlx '() vly '() vlz '()

)

(Repeat z0

(Repeat y0

(Repeat x0

(PrinC "\n(") (PrinC z)(PrinC y)(PrinC x)(PrinC ")")

(SetQ vlx (Cons (GetReal " 元素数据: ") vlx)

x (1+ x)

)

)

(SetQ vly (Cons (Reverse vlx) vly)

y (1+ y)

vlx '() x 1

)

)

(SetQ vlz (Cons (Reverse vly) vlz)

z (1+ z)

vly '() y 1

)

)

(SetQ l (Reverse vlz))

(While (Progn (InitGet 7 "Exit Find ")

(SetQ k (GetKWord "\nExit(结束)/: "))

(/= k "Exit")

)

(SetQ x (1- (GetInt (StrCat "\nX维序号(" (IToA x0) "): ")))

y (1- (GetInt (StrCat "\nY维

序号(" (IToA y0) "): ")))

z (1- (GetInt (StrCat "\nZ维序号(" (IToA z0) "): ")))

)

(PrinC (Nth x (Nth y (Nth z l))))

)

(PrinC)

)

C:DataIO用于建立一个三维数组,之后提取和显示该数组中指定的数据。数组保存在变量L之中。

值得注意的是,这样的数组要占用堆区空间,不可以过于巨大,但是 AutoLISP 数组处理功能是相当强的,

笔者用一台128M内存的PII 333主机,制作了生成一百万个元素的数组(每个元素是三个实数和一个索引组成):

'(1259 123.456 17.377 98706.964)

定义数组,解释运行耗时约20.7秒,编译运行耗时15.9秒。而引用任一元素仅是瞬间的事。

这种数组创建和引用的能力,将能顺利解决解析程序中大规模矩阵运算的基础设施问题,

也是AutoLISP具有特色的功能:简单、快速、容易控制、数据量大。

t 点评

用表类型数据结构组建数组,是一种典型的用法。“表”是AutoLISP 中一种万能的数据结构容器,

发挥你的想象力,利用表构建专业程序中的各种应用数据结构,就会体验到 AutoLISP 程序设计独特的优点,甚至在外挂工程数据文件中,也应当使用表结构。

3.类似数组定义

(setq i 3 j 1) ;;这里的i值就相当于VB中数组的下标

(repeat i)

(eval (read (strcat "(setq s" (itoa j) " j)")))

(setq j (+1 j))

)

AutoLISP没有VB中类似数组的定义,这就造成有时在程序中需要对一系列关联数据进行储存处理时比较麻烦,

因为这些关联数据是程序运行的过程中产生的,个数往往是不确定的,可能是三个数据,也可能是五个数

在VB中,你可以通过定义一个数组来解决这个问题,不必考虑数据的个数,只要保证程序运行中产生的数据

数不超过所定义数组的下标就可以了。但在AutoLISP中因为不能定义数组,就比较麻烦。

相关文档
最新文档