Lisp中的Shell语言

2021-01-29 02:22:08

首先,让我们弄清楚我们的意思:shell。 Shell是操作系统的基本命令解释器。当使用cd,ls,rm时,您使用的是外壳程序中的指令。就这么简单...

那些开发了Unix shell的人做得非常出色,即使有时人们对某些命令名称的相关性犹豫不决,这些命令名称的加密形式有时对于新手来说很难解释。但是,作为Unix核心的主要概念,管道是一场革命。在机器内存很少的时候,简单地逐行处理链式处理的能力突然允许过渡到执行规模,此规模直到那时才需要大型特定程序。因此,随着Aho和Weinberg的awk解释器的发明者Brian Kernighan重新计算,现在人们可以用一行代码来计算文档中特定单词的存在,以至于无法保存在内存中。

Aho,Weinberger和Kernighan的名字出现在这里并不是巧合(awk是其首字母的组合)。确实,Unix不仅引入了管道的概念,而且还推广了正则表达式的使用。而awk旨在从这些表达式中获得最大的收益。

多亏了awk,用户终于可以对操作系统返回的数据进行操作。 awk引入了一些相当革命性的概念,例如字典和从输入行中提取的字段。但是,awk具有相当不合常规的语法,因此重新读取旧脚本有时可能是一个挑战。我不想对此引起任何争议,我长期以来一直是gawk的热情用户,但痛苦不已,但很高兴拥有这样一个有用的工具。

长期以来,我想知道awk是否可以替代...

LispE是一个自制的Lisp解释器,旨在实现尽可能优雅和可读的C ++代码。我很难客观地量化我是否达到了预期的结果,但是我认为我编写了整个职业中最干净的代码之一。如果仅采取一种措施,那将是与我以前的工作的比较,无论是在实现还是设计方面,大多数都非常粗糙。

产生自己的口译员的好处是您可以随心所欲地使用它。

我已经可以听到一些有趣的评论了:真的,您在抱怨awk的奇特语法,您想改用Lisp吗?

为此,我只回答一件事...好!没错。假设Lisp的括号有点饱和。

但是,该语言功能强大,非常灵活,并且语法既简单又实用(从字义上讲)。

LispE提供了一个可以直接编辑和执行Lisp指令的环境。特别是,LispE提供了一个交互式解释器,该解释器允许例如在执行结束时测试指令或检查全局变量的值。

而且,该交互式解释器允许从外壳执行指令。为此,您所需要做的就是在指令之前加上'!&#39。

甚至可以将该指令的结果存储在Lisp变量中。您所要做的就是编写:!var = instruction,以便var接收指令执行的内容:

如果浏览历史记录,肯定会找到此行。 command是LispE公开的一条指令,它允许执行Shell命令并以列表形式返回此命令的结果。

但是LispE更进一步。我们还添加了其他命令行选项,这些选项允许在管道序列中集成对LispE的调用。

这是最简单的选择。它在管道前面的命令行上使用。

LispE读取管道返回的内容并初始化一个列表:_args,其中每个元素对应于在stdin上读取的一行。

然后,LispE作为交互式解释器运行,使您可以按照自己的步调逐步构建必要的代码。

ls -al | lispe -a_args因此包含:(&#34 ;."" .."" .DS_Store"" .git"" Lispe""" Makefile.in"" README.md""检查" \" checkrgx.py"& examples"" include"" macCopie.sh"" src""模板""""")

也可以构建一个程序来检查此列表的内容并对其进行处理:

让我们注意,如果要在LispE的内部编辑器中编辑程序,则必须在其后放置edit命令:

另一方面,此选项允许您将解释器真正放置在管道序列中。

指令是针对管道中的每条新行执行的,这与-a预先读取所有行不同。

accu1,accu2,...,accu9:在启动upl0时初始化为0的九个预定义累加器:是完整的当前行l1,l2,l3 ...:是与&l; l0'字段相对应的变量。 ln:对应于在#10中找到的字段数。.ll:是由所有字段组成的列表

ls -al | lispe -p' l10' #产生:#。 #..#DS_Store#.git#Lispe#Makefile#Makefile.in#README.md#check#checkrgx.py#...#我们计算目录中所有文件的大小-al | lispe -p'(+ = accu1 l6)' .54480011044 ...

ls -al | lispe -p'(print(l2型)""(l3型))' " #integer_ string_#integer_ string_#integer_ string_#integer_ string_#integer_ string_ ...

ls -al | lispe -p'(类型l2)(类型l3)'。 #即使设置已执行,此处仅显示(类型l3)#string_#string_#string _...

ls -al | lispe -p'(loop v ll(print(type v)"")'#string_ integer_#string_ integer_ string_ string_ integer_ string_ string_ integer_ string_ string_ string_ string_ string_ integer_ string_ string_字符串_整数_字符串_字符串_字符串_字符串_字符串_整数字符串_字符串_字符串_字符串_整数_字符串_字符串_字符串_字符串_整数_字符串#字符串_整数_字符串_字符串_整数_字符串_字符串_字符串_字符串_整数_字符串_字符串_字符串_字符串_整数_字符串#字符串_整数_字符串_字符串ing_字符串_字符串_字符串_整数_字符串_字符串_字符串_字符串_整数_字符串_字符串_字符串_字符串_整数_字符串

ls -al | lispe -pb'(setq s 0)-pe'(println" Sum =" s)' -p'(+ = s l5)'允许计算目录中存在的文件大小的总和。

该选项的工作原理与-p相同,但是它不使用代码,而是使用包含程序的文件。

重要说明:该文件必须包含一个runpipe函数,该函数充当程序的入口点。

为了确保完成对外壳语言的转换,我们添加了与-p / -P关联的-r / -R选项。

这些选项在执行前检查正则表达式是否与输入行匹配-p / -P给定的代码。

#以下形式过滤掉序列中不包含至少3位数字的行-al | lispe -r" \ d \ d \ d" -p" l0" #给出以下代码:#-rw-r--r-- 1个roux NLE \ Domain用户10244 26 Sep 16:42 .DS_Store#-rwxr-xr-x @ 1个roux NLE \ Domain用户1715 Sep 9:18 Makefile# -rwxr-xr-x @ 1 roux NLE \ Domain用户3297 23 Sep 14:02 checkrgx.py#相同,但带有内部正则表达式(请参见文档) lispe -R"%d%d%d" -p" l0"