TIL:TCL激发的命令语言在D顶部

2021-05-16 04:28:34

直到是一个命令语言,如tcl,builton顶部的d,所以它有点在双层世界。

作为命令语言意味着很容易学习,语法isvery可扩展。并用D构建意味着为它构建模块非常简单。

直到利用纤维,因此解释器是默认andspawning的新进程(“过程”而不是在OS Sense中,但在Erlang Sense中)是微不足道的。

最后,TIL具有数据流,允许您处理Datausing A(希望)熟悉的概念:管道。

当然,使用“set”而不是更多的commansyntax x = 1而且对许多人来说可能感到太奇怪,但如果你能过度地感受到你会看到它真的是一种非常优雅的设置方式命令语言中的值。

你看,语言的一个目标之一是有一个连贯和简单的语法,使你永远不会被困在“但有更多”的周期 - 相反,学习一次,快速学习它,没有令人惊讶的是。

上面的赛段将打印你好,世界!使用std.io buildinpackage。直到有原子的概念,所以在集S"你好,世界!"我们有2个原子(套装和s)和1个字符串("您好,世界!")。在io.out $ s中,我们再次拥有2个原子(io.out和$ s),作为替代替换原子,即Atom,即在评估时返回存储在当前上下文中的值s。

上面的片段将打印结果是33.第一个新概念是使用方括号([])。它们形成了我们称之为官方的职权。

execlist包含任何子程序,并立即评估,即,在命令(在这种情况下,设置)之前执行子程序。所以,当Set结果[Math($ a + $ b)]时,将执行数学($ a + $ b),结果(33)将成为set命令的thelast参数,成为设置结果33。

但数学来自哪里?嗯,它不是一个内置的语音命令(虽然语言有一些内置命令),但是,它是一个模块,其完整名称是std.math。当TilInterpreter面临着一个未知的命令名称时,它会尝试自动导入Premodule,因此您不需要在很多导入语句中隐藏每个程序标题。

并且,除此之外,可以将模块称为命令。例如,std.math实现了运行命令,也可以仅作为std.math调用(或您将其作为别名)调用。这是因为Lotsof模块有一个非常非常常见的用法到福出的developers始终使用“合格名称”的点,感觉是根本错误的。 andboring。

一个有趣的例子是std.dict模块。主要目的是,ISInevitibly将创建新的词典(“DICT”在TINPETHON SENSE中:它在D或“对象”indavascript中的“关联阵列”)。所以这会觉得无聊总是叫Dict.Create,喜欢:

导入std.dict作为dictset d1 [dict.create(a" alfa")(b" beta")(c" gama")]设置d2 [dict。创建(Alfa 1)(Beta 2)(GAMA 3)]

设置d1 [dict(a" alfa")(b" beta")(c" gama")]设置d2 [dict(alfa 1)(beta 2) (GAMA 3)]

这就是std.math模块的情况:每次都不要调用math.run,因为这是模块的主要目的,SOSimply调用数学将会做。

并且,此会话中的最后一项是字符串替换。它真实地工作,您可以使用$符号参考字符串内的值。

proc cmd_push {fd argv dir} {if {[catch {llength $ :: db([lindex $ argv 1])}]}} {...

所说的是“如果内存数据库中存在的东西,则键在Argv内的第二项给出的内存数据库。问题是:PHEW!,这是很多命令,特别是为了如此常见的操作。

设置d [dict(alfa 11)(beta 22)(gama 33)] io.out" alfa是" < $ d alfa> #输出:Alfa是11

<>语法遵循图案<数据索引>或<数据范围&gt ;. OneCan轻松检索来自列表的元素:

设置列表(a b c d e)io.out"第二个元素是" < $ lista 1> #aio.out"第四和第五个元素是" < $ lista 3 5>#(d e)io.out"第一个元素是" < $ lista head> #aio.out"尾巴" < $ lista tail>#(b c d e)io.out"偶数索引元素" < $ lista(0 2 4)>#(a c e)

这使得代码更加清洁,更易于理解。可以通过这种方式写入LMDB:

proc cmd_push {fd argv dir} {if {list.length< $ db< $ argv 1>> > 0} {...

在此示例中,您可以看到声明新的“函数”。技术上不应该返回一个价值但是,你知道......遵循一些传统来说太多了 - 对于来自TCL的开发人员来说,PROC语法会感到非常熟悉,所以我们愿意。

参数列表(x y)是一个简单的愿者。这意味着它的contentis不是子程序,而只是列出的“listItems”列表。该内容尚未以作为程序执行,但被评为列表。

现在,手术机构应该在一段时间内执行,声明为一个子忠诚,即,该命令的命令列表。但是,与execlist与execlist发生的反映,将立即执行一个子辨。

你看,直到是一个命令语言。最终是苏丹国的命令如此突破。它签名是proc名称参数正文,其中:

因此,您必须将这些“类型”传递给命令或至少对这些类型的某种毒品探查员。如果将Sublist存储到您可以说的名为DAME的变量中:

那也没关系。 如果您的参数列表存储在另一个Variable中,您也可以说: 而且,最后,如果您的过程名称也被存储到变量中,则会说: 只要每个变量代表Atom,SimpleList和Sublist,您就可以在没有任何问题的情况下定义新过程。 显示流使用的最简单示例是该伪造来自某个整数数字的当前数字: 范围3 | foreach x {io.out $ x}#预期输出是:#0#1#2#3 (YUP,范围将包括在这种情况下的“限制” - “3”。) 范围是一个非常多功能的命令(它实际上是模块std.range),它允许您创建各种范围和eventRansform将SimplElist进入数据流。

数据流通过管道(|)行进,并且各种命令被称为管道。

因此,例如,如果您想浏览您应该使用USEA数据流的目录,因为您通常无法保证目录中有多少条参赛作用。并且相同适用于从套接字接收或从文件读取的数据。

有趣的是,Foreach仅适用于数据流。它唯一只能将一个原子命名为当前项。如果您的流组成了vplelists(即:如果每个项目由多个值组成),则可用于将每个项目设置为将每个项目存储到变量中:

my_stream | foreach项目{#$ Item是(原点标题数据)设置原点标题数据$ Item}

这是因为Set命令可用于“破坏”一种简单的宣注:

proc ping(目标){接收| foreach msg {发送$ target $ msg break}} proc pong(){接收| foreach msg {io.out"收到$ msg" break}} set writer_process [spawn pong] secter_process [spawn ping $ writer_process]发送$ sender_process"一条消息和退出"

主要过程发送消息"消息和退出"到$ sender_process,这是ping进程的pID,并退出。

Ping Process收到消息,将其发送到$目标(即Pong进程),打破循环并退出。

关于Backressure:每个过程都有一个有限的消息框。如果您自己的进程正试图向另一个邮件发送邮件,则为已满的Whosemessage框,您的进程将被阻止。

(它将阻止其执行,但不是调度程序本身。当然是:其他进程不会受到影响。)

直到til存在核心概念是:每个程序都是一个文件。在Python或Ruby Sense中没有“模块”,就像一个实体存在于口译员内存中的某处。在TIL中,您的Modulesare只有命令提供商和您想要incorminto的任何直到代码必须...必须...包含在您的程序中。

包括文件具有与复制其内容andpast的效果相同,其中调用包含命令。

你看,直到是一种很好的语言,但你不应该在直到til中编写的代码。如果要实现某些算法,请将其写入d并将其作为模块共享。

在另一篇文章中的更多细节中将解释理由,但现在足以说直到是一种脚本语言,而且不鼓励你不仅仅是“一个节目”,就是这样,这是预期的用作其他组件的“命令和控制”,而不是实现算法或数据结构的主要语言。