14.9 List函数
List函数用于定义一个二维或三维点。若表达式中不包含任何变量及未定义项,则该函数还可以使用单引号(’)命名。
示例(setq x(List 2.5 3.56)) 返回 2.5,3.56
(setq x’(2.5 3.56)) 返回 2.5,3.56
14.10 car、cdr与cadr函数
1.car函数
car函数返回一个表中的第一个元素。若表中不包含任何元素,函数返回nil。
car函数格式为:(car List)
其中car…......返回第一个元素
list.........元素列表
示例:(car‘(2.5 3.56)) 返回 2.5
(car‘(x y z)) 返回 X
(car‘((15 20) 56)返回(15 20)
(car‘())返回 nil
其中的单引号表示~个表。
2.cdr函数
cdr函数返回一个移去了表的第一个元素后的列表,其格式为(cdr List)
其中cdr .........返回第一个元素被移去的列表
list.........元素列表
示例:(cdr‘(2.5 3.56)) 返回(3.56)
(cdr‘(x,y,z) 返回(y,z)
(cdr‘((15 20)56) 返回( 56)
(cdr‘()) 返回nil
3.cadr函数
cadr函数执行两个操作,cdr和car,返回列表中第二个元素。cdr函数移去了第一个元素。car函数返回新表中的第一个元素。、cadr函数的格式为:(cadr List)
其中 cadr……...执行两个操作( car(cdr‘(x y z)))
List………元素列表
示例:(cadr‘(2 3)) 返回3
(cadr‘(2 3 56)) 返回3
( cadr‘(x y z)) 返回y
(cadr‘((15 20) 56 24))返回56
这些例子中, cadr执行两个操作
(cadr‘(x y z))=(car(cdr‘(x y z))
=(car‘(y z)) 返回 y
注意 除car、cdr和cadr函数外,还有其他几个函数用于选取列表中的不同元素。下面是这些函数的列表,其中函数f由列表‘((x y f)z w)组成。
(setq f‘((x y)z w))
(caar f)=(car(car n) 返回x
(cdar f)=(cdr(car f)) 返回(y)
(cadar f)=(car(cdr(car f))) 返回y
(cddr f)=(cdr(cdr f) 返回(w)
(caddr f)=(car(cdr(cdr f))) 返回W
14.11 graphscr、textscr、princ与terpri函数
1.graphscr函数
若系统只有一个屏幕,graphscr函数将文本窗口转换为图形窗口,若系统有两个屏幕,该函数将被忽略。
2.textscr函数
若系统只有一个屏幕,textscr函数将图形窗口转换为文本窗口,若系统有两个屏幕,该函数将被忽略。
3.princ函数
Princ函数打印(或显示)变量的值。若变量位于双引号中,该函数打印(或显示)双引号内的表达式。
princ函数的格式为:(Princ[变量或表达式])
示例:(princ)在屏幕上打印一个空行
(princa)在屏幕上打印出变量a的值
(princ“Welcome”)在屏幕上打印Welcome
4.terpri函数
terpri函数用于在屏幕上打印一个新行,与\n作用相同。该函数用于打印紧跟着terpri函数的一行。
示例:(setq p1(getPoint“Enter first Point:”))(terpri)
(setq p2(getPoint“Enter second Point:”))
第一行(Enter first Point:)将显示在屏幕的命令提示区中。 terpri函数产生了一个回车,因此第二行(Enter second Point:)将显示在新的一行中,也就是第一行下面的一行。若没有terpri函数,这两行将显示在同一行中(Enter first Point:Enter second Point:)
例3
编写一个程序,提示用户输入一个矩形的两个对角的坐标,然后在屏幕上画出该矩形,如图12-7所示。
输入 处理过程
P1点的坐标 1.计算PZ点和P4点的坐标
P3点的坐标 2.画出下列直线
P1到P2的直线
P2到P3的直线
P3到P4的直线
P4到P1的直线
P2和P4两点的X,Y坐标可以通过car及cadr函数算出。car函数从给定的列表中选取X坐标,cadr函数选取Y坐标。
P2点的X坐标: P2点的Y坐标:
X2=X3 Y2=Y1
X2=car(X3 Y3) Y2=cadr(X1 Y1)
X2=car P3 Y2=cadr P1
P4点的X坐标: P4点的Y坐标:
X4=X1 Y4=Y3
X4=car(X1 Y1) Y4=cadr(X3 Y3)
X4=car P1 Y4=cadr P3
故,P2点和P4点为:
P2=(list(car P3)(cadr P1))
P4=(List(car P1)(cadr P3))
下面的文件是例3的程序清单。
(defun c:rect1(/p1 p2 p3 p4)
(graphscr)
(setvar“cmdecho”0)
(prompt“rect1 command draws a rectangle”)(terpri)
(setq p1(getpoint \"Enter first corner\")(terpri)
(setq p3(getpoint \"Enter opposite corner\")(terpri)
(setq p2(list(car p3)(cadr p1)))
(setq p4(list(car p1)(cadr p3)))
(command \"line\"p1 p2 p3 p4 \"c\")
(setval \"cmdecho\" 1)
(Princ)
)
说明
第1行:(defun c:rect1(/p1 p2 p3 p4)
defun函数定义了函数rect1。
第2行:(graphscr)
如果当前屏幕恰好是文本屏幕,该函数将文本屏幕转换为图形屏幕。否则,对显示屏幕无影响。
第3行:(setvar“cmdecho”0)
函数setvar将0赋予AutoCAD系统变量cmdecho,即关闭了回显。如果cmdecho被关闭,AutoCAD的命令提示就不会显示在屏幕的命令提示区中。
第4行:(prompt“rect1 command draws a rectangle”)(terpri)
prompt函数将显示双引号中的信息(“rect1 command draws a rectangle”)。函数terpri产生一个回车,因此下一行文本会打印在单独一行上。
第5行:(setq p1(getpoint \"Enter first corner\")(terpri)
getpoint函数暂停程序的运行,等候用户输入一个点(该矩形的第一个角),随后setq函数将该值赋予变量P1。
第6行:(setq p3(getpoint \"Enter opposite corner\")(terpri)
getpoint函数暂停程序的运行,等候用户输入一个点(该短形的对角),随后setq函数将该值赋予变量P3。
第7行:(setq p2(list(car p3)(cadr p1)))
cadr函数选取P1点的Y坐标,car函数选取P3点的X坐标。setq函数将这两个值组成的列表赋予变量P2。
第8行:(setq p4(list(car p1)(cadr p3)))
cadr函数选取P3点的Y坐标,car函数选取P1点的X坐标。setq函数将这两个值组成的列表赋予变量P4。
第9行:(command \"line\"p1 p2 p3 p4 \"c\")
Command函数使用AutoCAD的line命令在点P1,P2,P3和P4间画线。C(close)将最后一点P4与第一点P1连接起来。
第10行:(setval \"cmdecho\" 1)
setvar函数将1赋予AutoCAD系统变量cmdecho,即打开了回显。
第11行:(princ)
princ函数在屏幕上打印一个空行。若没有这一行, AutoCAD将打印出最后一个表达式的值。该值对程序毫无影响,但却可能令人费解。princ函数用来防止在命令提示区显示该表达式的值。
第12行:该右括号表明完成函数rect1的定义,并且程序结束。
注意 在这个程序中,定义一个矩形的两个角后,该矩形被生成。当移动屏幕光标输入第 二点时,该矩形不会被拖动。然而,可以使用getcorner函数来拖动该矩形,如以下程序清单所示:
(defun c:rect2(/p1 p2 p3 p4)
(graphscr)
(setvar“cmdecho”0)
(prompt“rect2 command draws a rectangle”)(terpri)
(setq p1(getpoint \"Enter first corner\")(terpri)
(setq p3(getcorner p1 \"Enter opposite corner\")(terpri)
(setq p2(list(car p3)(cadr p1)))
(setq p4(list(car p1)(cadr p3)))
(command \"line\"p1 p2 p3 p4 \"c\")
(setval \"cmdecho\" 1)
(Princ)
)

