命令行参数
在 Linux/Unix系统下, 将下面的代码写在脚本文件的第一行:
`#!/usr/bin/newlisp`
指定一个更大的堆栈:
`#!/usr/bin/newlisp -s 100000`
或者
`#!/usr/bin/newlisp -s100000`
不同系统的Shell在解析第一行和提取参数的处理方式是不一样的。newLISP可以处理联合和分开两种参数传递方式(如上).下面这段简单的代码可以用来测试各种系统的参数处理方式. 脚本将堆栈设置成100,000 ,内存最大占用量限制在10M以内.
```
#!/usr/bin/newlisp -s 100000 -m 10
(println (main-args))
(println (sys-info))
(exit) ; important
```
下面是某个系统的输出数据:
```
./arg-test
("/usr/bin/newlisp" "-s" "100000" "-m" "10" "./arg-test")
(308 655360 299 2 0 100000 8410 2)
```
记住只有少数newLISP程序需要修改更大的堆栈参数; 大部分情况下默认的2048已经够用了. 每个堆栈平均消耗80个字节. 其余的newLISP参数选项,爬手册去吧。
管道交互
下面代码展示了如何将一个文件通过管道输入到newLISP 脚本中.
```
#!/usr/bin/newlisp
#
# uppercase - demo filter script as pipe
#
# usage:
# ./uppercase < file-spec
#
# example:
# ./uppercase < my-text
#
#
(while (read-line) (println (upper-case (current-line))))
(exit)
```
文件内容将会被转换成大写然后打印到标准输出 (std-out).
下面的代码能够处理非文本的二进制文件(包含了0字符):
```
#!/usr/bin/newlisp
;
; inout - demo binary pipe
;
; read from stdin into buffer
; then write to stdout
;
; usage: ./inout < inputfile > outputfile
;
(while (read 0 buffer 1024)
(write 1 buffer 1024))
(exit)
```
将缓冲区大小设置到最高效的尺寸.
文件过滤
下面的脚本类似Unix下的 grep , 遍历每一个文件,并用正则表达式过滤文件中的每一行.
```
#!/usr/bin/newlisp
#
# nlgrep - grep utility on newLISP
#
# usage:
# ./nlgrep "regex-pattern" file-spec
#
# file spec can contain globbing characters
#
# example:
# ./nlgrep "this|that" *.c
#
# will print all lines containing 'this' or 'that' in *.c files
#
(dolist (fname (3 (main-args)))
(set 'file (open fname "read"))
(println "file ---> " fname)
(while (read-line file)
(if (find (main-args 2) (current-line) 0)
(write-line)))
(close file))
(exit)
```
表达式:
`(3 (main-args))`
相当于:
`(rest (rest (rest (main-args))))`
返回一个包含了所有文件的列表. 这种为rest指定索引的形式称为隐式索引. 隐式索引细节或其它用法参考用户手册. 表达式` (main-args 2)` 提取命令行的第三个参数作为正则表达式.
newLISP 作为管道
管道直接将每行简短的代码输入到newLISP中执行运算。
```
~> echo '(+ 1 2 3)' | newlisp
6
~>
```