学习 newLISP
2011-07-15
最近在 Algo 的影响下开始学习 newLISP。
关于 newLISP ,它的官方网站上是这么介绍的:
newLISP is a Lisp-like, general-purpose scripting language. It has all the magic of traditional Lisp but is easier to learn and use. newLISP is friendly, fast, and small. Most of the functions you will ever need are already built in. newLISP runs on most operating systems.
就是说,它是一种类似 Lisp 的,多用途的脚本语言,不但有着传统 Lisp 的所有魔力,还很容易学习和使用。它很友好,很快,同时很小巧。你可能会用到的大多数功能它都已经内置了,并且它可以在大多数操作系统上运行。
翻了一段时间的文档后,我觉得该尝试着用它写点东西了,下面是我的第一个 newLISP 脚本:
(define (prime (n))
(let (pn (list))
(for (i 2 n)
(set 'flag nil
'm (+ 1 (int (sqrt n))))
(dolist (p pn (or
(>= p m)
(if (= (% i p) 0)
(set 'flag p)))))
(if (= flag nil)
(push i pn -1)))
(println pn)))
(prime 100)
(exit)
功能很简单:打印出 100 以内的所有质数。
不过,貌似我还没有体会到 LISP 的高明之处,上面的代码其实和下面的 Python 代码没什么太大的不同(甚至更啰嗦一点,因为多了一个 flag 变量):
import math
def prime(n):
pn = []
for i in xrange(2, n + 1):
m = int(math.sqrt(i)) + 1
for p in pn:
if p >= m:
pn.append(i)
break
if i % p == 0:
break
else:
pn.append(i)
return pn
print prime(100)
或许有更“LISPly”的写法,或许不久的将来我能改进这个脚本。
不过,newLISP 在运行速度上并不是很快。根据 Algo 的测试,使用相同的算法求质数,newLISP 要比 C 慢大约 50 倍。根据我的测试,相同算法下 newLISP 也比 Python 至少要慢了一倍。
发表评论:
电子邮件地址不会被公开。必填项已用 * 标注。
评论:
按这么多括号累不?还都是要带Shift的
累,呵呵,不过括号配对的事编辑器可以帮很大的忙。
newlisp版第5行有问题,应该是i而不是n另外lisp的想法是:如果有个判断一个数是不是质数的功能该多好啊
(= 1 (factor n)) 就可以判断质数了