newLISP的最大特点就是语法简单,估计一张纸能说明白最常用的。下面就说几个:
define 是用来定义函数的,比如下面定义并使用了一个my-add函数
> (define (my-add x) (+ 1 x))
(lambda (x) (+ 1 x))
> (my-add 4)
5
调用函数上面已经演示过,就是(函数名 参数1 参数2) 这样的形式,比如复制一个文件:
> (copy-file "/opt/git_backup.lsp" "/opt/git_backup.lsp2")
true
返回true表示复制成功。
阻止表达式求值
前面加一个单引号就可以了。比如:
> '(+ 2 4)
(+ 2 4)
条件语句
> (if (= 9 9) (println "ok"))
ok
"ok"
上面在条件判断成立的情况下,打印"ok"字符串。
看到两次是因为第一次是println打印,第二次是(println "ok") 的返回值显示在交互环境下。
来个实际应用到的,directory可以返回指定目录下的子文件(非递归)组成的list, 如果目录不存在,则返回nil, if判断会失败。
> (directory "/opt")
("shareOn110" "gitolite.conf-compiled.pm" "repositories" "scrum.sql" ".." "git_backup.lsp2"
".#git_backup.lsp" "." "git_backup.lsp" "git_backup.lsp~" "#git_backup.lsp#" "gitolite.conf")
> (directory "/opt/a")
nil
> (if (directory "/opt/a") (println "ok"))
nil
因为/opt/a目录不存在,所以不会打印"ok"。
下面的if语句复杂点,有点像case语句的结构,如果条件之一满足,则分别执行对应的语句。如果所有条件都不满足,则执行最后的语句:
(if
(= ostype "Linux") (import "libz.so")
(= ostype "BSD") (import "libz.so")
(= ostype "OSX") (import "libz.dylib")
...
(println "cannot import libz on this platform")
)
遍历list
dolist就是干这事的。
> (dolist (file (directory "/opt")) (println "file: " file))
file: shareOn110
file: gitolite.conf-compiled.pm
file: repositories
file: scrum.sql
file: ..
file: git_backup.lsp2
file: .#git_backup.lsp
file: .
file: git_backup.lsp
file: git_backup.lsp~
file: #git_backup.lsp#
file: gitolite.conf
"gitolite.conf"
>
(println ...) 用来打印file.
exec执行系统命令:
比如备份文件:
> (exec "cp -r /home/git/repositories /opt/shareOn110/bk/")
()
>