当前位置: 首页 > 工具软件 > newLISP > 使用案例 >

newLISP语法

葛晔
2023-12-01

newLISP的最大特点就是语法简单,估计一张纸能说明白最常用的。下面就说几个:

define 是用来定义函数的,比如下面定义并使用了一个my-add函数

> (define (my-add x) (+ 1 x))
(lambda (x) (+ 1 x))
> (my-add 4)
5

(+ 1 x) 是函数体。

调用函数上面已经演示过,就是(函数名 参数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"
> 

上面的代码首先用directory找到/opt目录下的文件,放在一个list中返回,然后用(dolist (file ...) 来遍历。file里面就是每次遍历的list中的一个元素。

(println ...) 用来打印file.


exec执行系统命令:

比如备份文件:

> (exec "cp -r /home/git/repositories /opt/shareOn110/bk/")
()
> 




 类似资料: