第一个Lisp只是一个经典示例:
- (defun c:fract3( / a b c)
- (defun mid(a b)
- (mapcar '* (mapcar '+ a b) '(0.5 0.5 0.5))
- )
- (defun draw(a b c)
- (entmake (list '(0 . "LINE") (cons 10 a) (cons 11 b)))
- (entmake (list '(0 . "LINE") (cons 10 b) (cons 11 c)))
- (entmake (list '(0 . "LINE") (cons 10 c) (cons 11 a)))
- (if (< 0.1 (distance a b))
- (progn
- (draw a (mid a b) (mid c a))
- (draw (mid a b) b (mid b c))
- (draw (mid b c) (mid c a) c)
- )
- )
- )
- (setq a (polar '(0 0 0) (/ PI 2) 25)
- b (polar '(0 0 0) (/ (* PI 7) 6) 25)
- c (polar '(0 0 0) (/ PI -6) 25)
- )
- (draw a b c)
- )
它使用递归绘制越来越多的线,形成越来越小的三角形。当要绘制的线变小为0.1个绘制单位时,它停止。我自己也想知道这个程序有多短——这证明了Lisp的强大。
第二个程序:我开始的时候脑海里有一个折线符号。这次我放弃了递归,用户可以控制递归的深度。它从一条线开始,在树上断开。第一行保留作为参考(绿色的一行),程序每次运行都会打断在上一步生成的所有行。有一个声明为全局变量的列表,用于在程序运行之间保存数据。如何使用:加载程序并首先运行。之后可能需要缩放。再运行一次程序,再运行一次…只需按空格键即可进入下一个级别。
|