无极4娱乐官网下载-安卓无极平台-无极棋牌捕鱼

    
当前位置:首页无极4娱乐官网下载正文
admin

until,@程序员,为什么挑选 Racket 言语?

  3个月前 (05-13)     182     0
简介:@程序员,为什么选择 Racket 语言?...

Racket 作为许多 Lisp 方言中的一种,是一种可编程的核算机程序规划言语 ,一同也是一个程序规划环境。其也曾一度被列入教科书的材料,可是关于这门小众化言语,是否有必要上手?

作者 | beautiful racket

译者 | 彼得

责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:

作为Lisp言语的新手,我从前迷失在各种关于Lisp的溢美之词。我乃至不知道其间某些词的意义是什么。比方,人asmer们常常说Lisp是另一场影响深远的启蒙运动。当然,你怎样说它都能够。

关于人们来说,有一个更简略和实践的问题:Lisp对我来说意味着什么?我此前写过文章对此进行了阐明。我总结和答复了为什么不了解Lisp言语或特别是Racket言语的人值得花时刻去了解它们。

我列出了关于我这个Rocket初学者最重要的9个言语特性。其间,第五个特性是“创立新的编程言语”。这项技能也被称为面向言语编程,或LOP。

在那之后的几年里,面向言语编程现已成为我喜爱Racket的最重要的原因。在此过程中,我也把自己关于Racket的喜爱转化为举动。除了开发言语之外,我还写了在线书本 《Beautiful Racket》。我以为LOP是一项技能,而Racket是一种完结该技能的东西。在该书中,我关于LOP和Racket都进行了介绍。

until,@程序员,为什么选择 Racket 言语?

在作业中,我开发了一种依据文本的编程言语Pollen。我用它来完结我的在线图书《Practical Typography》和《Beautiful Racket》。在Pollen中,上面的阶段会被表明为:

#lang pollen

在链接◊ link[ "why-racket-why-lisp.html#so-really-whats-in-it-for-me-now"]{nine language features},我列出了关于我这个Rocket初学者最重要的 9个言语特性。其间,第五个特性是“创立新的编程言语”。这项技能也被称 ◊em{面向言语编程}, 或许 ◊em {LOP}。

另一个比方是brag,一个解析器的生成器(选用lex / yacc款式),它选用BNF语法作为源代码。下面是一个简略的bf言语的示例:

#lang brag

bf-program : (bf-op | bf- loop)*

bf-op : ">"| "<"| "+"| "-"| "."| ","

bf- loop: "["(bf-op | bf- loop)* "]"

#lang brag

bf-program : (bf-op | buntil,@程序员,为什么选择 Racket 言语?f- loop)*

bf-op : ">"| "<"| "+"| "-"| "."| ","

bf- loop: "["(bf-op | bf- loop)* "]"

这两种言语都是在Racket中完结的,能够运用一般的Racketuntil,@程序员,为什么选择 Racket 言语?解说器运转,也能够在Racket IDE(DrRacket)里运转。

重要问题

尽管这本书现已让不计其数的人开端了他们的LOP之旅,可是,我有时分仍是会忧虑自己会堕入被我批判过的Lisp倡导者们从前堕入过的困境之中。

假如LOP真的有这么强壮,那么您也就不需求花几天时刻来学习我这本教程,我也应该能够很轻松地解说它。我应该能够答复下面的两个简略的问题:

第二个问题很简略答复。可是,榜首个问题就不太简略答复。许多人也屡次问我榜首个问题。我经常用Potter Stewart法官说的那句名言来答复:你看到它的时分,你就会知道。这个答复对那些LOP的好奇者来说现已足够了。可是,对那些依然想要更多实践理由的张望者们,却不会让他们满足。

所以,我将进行一次更有意义的测验。请记住,我高中英语作文不是核算机科学系的教授。我不会像他们那样解说编程言语。相反,我将Racket和DSL用在我的实践作业中。我的目地是以对其他实践用户有参考价值的办法来论述问题。(假如我没有讲清楚,请您点击左面并发送议论。)

简略的答复

读到这儿,我估量得有一半的读者计划去互联网发布匿名的议论,对我的上述说法提出贰言。在你脱离这儿之前,请注意:不管怎样样,对我来讲都是能够承受的。一方面,LOP和Racket对我的编程功率来说是一个令人难以置信的力气倍增器。我乐意与你共享这些常识,让你也能够从中获益。假如你不承受我的观念,这些东西依旧是我的秘密武器,这样我也能够承受。我还能够比其他99.9%的人更有野心、更有影响地从事更有利可图的作业。

这一切取决于您的选择。

具体的解说

我开端考虑怎样答复一个大问题:为什么很难解说面向言语编程的优点?

或许是因为当咱们议论编程言语(简称言语)的时分,咱们其实想知道它们是什么编程言语,它们能够做什么。假如简略地这么想,咱们就很难看到面向言语编程的价值。

可是,假如咱们扩大咱们的视角,把言语看作是人机界面的一部分,那么咱们就更简略看到LOP的优势。

下面咱们就这么试一试。

特定范畴的言语与通用言语

首要,咱们先界说一些术语。面向言语的编程(又称LOP)是经过开发新的编程言语并用新言语编写程序的办法来解某些编程问题。这些新开发的言语一般被称为特定范畴的言语或DSL。

望文生义,特定范畴的言语是为了处理特定问题而开发的言语。例如,Post,SQL,make,正则表达式,.htaccess和零纪阁HTML都是特定范畴的言语。开发这些言语的初衷不是为了处理一切的问题,恰恰相反,人们开发它们仅仅为了处理某个特定的问题。

与特定范畴的言语相对的是通用言语。常见的通用言语包含C,Pascal,Perl,Java,Python,Ruby,Racket等。为什么这些言语不是DSL?因为人们以为它们能完结通用的核算使命。

实践上,这些通用言语一般都会在某些方面比其他言语做得更好。例如,C拿手体系编程。Perl拿手作为体系管理员的脚本言语。Python适宜作为初学者的言语。Racket拿手LOP。每种言语都有它们自己的规划初衷。

特定范畴的言语和通用言语也不是原封不动的。例如,Ruby开端是一种通用言语,但经过与Ruby on Rails的相关,它在很大程度上又变成了一种Web运用程序的DSL。另一方面,Java开端是一个用于Web浏览器脚本的DSL。可是现在,它现已像变异的病毒相同,与它最开端的时分截然不同了。

言语是什么?

假如特定范畴的言语和通用言语之间的一切这些都应该被称为言语,那么言语的特征是究竟是什么?

我知道你想说:“好吧,你错了。HTML不是一种言语。它仅仅符号。它无法表达算法。”。或许“正则表达式不是一种言语。它们不能独立存在。它们仅仅一种言语中的特定语法。“

我也从前这么以为。可是当我愈加细心地研讨之后,我发现阿郎的故事这些差异其实很细小。关于言语,在三个主要特征中,我以为榜首个是:编程言语本质上是一个沟通的前言,是人类和核算机之间以互相都能够了解的办法进行沟通的符号体系。

“符号”意味着言语包含语法; “能够了解”意味着言语具有附加到语法的意义(更专业的说法是语义)。 该界说涵盖了一切的通用编程言语和一切的DSL。(可是不包含一切的数据流,后边咱们再讲)

(趁便说一句,尽管人们一般一同运用“编程”和“言语”这两个词,可是,这儿所说的言语,并不仅仅是指人们用它来对核算机进行编程。有时分,核算机也用它来和咱们沟通,有时分核算机之间也用它来进行沟通。从严厉意义上讲,咱们不应该扫除言语的这些运用场景。可是,实践上,咱们一般用编程言语做的便是编程。 )

咱们再来说一下HTML。它能够通知核算机,更切当地讲是浏览器,怎样来制造网页。它是人和核算机都能够了解的符号体系(包含尖括号,标签,特点等)(charset特点用来界说编码的字符集,p标签用来界说阶段,等等)。

HTML的代码片段如下:

<!DOCTYPE html>

<html>

<head>

<metacharset="UTF-8">

<title>My web page </title>

</head>

<body>

<p>Hello <strong>world </strong></p>

</body>

<html>

假如你对HTML是一种编程言语的说法有贰言。咱们能够用Python来输出咱们的页面。Python是一种真头七正意义上的编程言语,你应该没有贰言吧?

print " <!DOCTYPE html>"

print " <html>"

print " <head>"

print " <metacharset="UTF-8">"

print " <title>My web page </title>"

print " </head>"

print " <body>"

print " <p>Hello <strong>world </strong></p>"

print " <云南省地图;/body>"

print " <html>"

显着,这种区别对待HTML和Python的做法是对立的。Python化仅仅增加了杂乱性并供给了模板。还有,从操控Web浏览器的视点讲,Python仅有风趣的语义内容便是嵌入在HTML中的内容。出于一致性考虑,咱们能够得出定论:HTML尽管比Python更简略且不灵敏,可是它的确是一种编程言语。假如你以为Python是一种编程言语而HTML不是,那么,咱们应该很简略揣度上面这个Python片段是程序,而上面的HTML代码则不是。

嵌入式言语

上面的HTML片段是咱们特意规划的。但这种将DSL嵌套在另一种言语中的做法是普遍存在的。以这种办法运用的言语被称为嵌入式言语。它们代表了最常见的面向言语编程。作为一名程序员,即便您不知道LOP的正式称号,您也现已用了很长时刻。

例如,正则表达式。咱们或许不会以为正则表达式是一种独立的言语。但每个程序员都知道下面这段代码的意义:

^fo+(bar)*$

与HTML相同,咱们能够用宿主言语的符号编写等效的字符串匹配核算。例如,Racket支撑计划的正则表达式(SRES),它们是运用正则表达式S-表达符号。上美观的三级片面的方式会这样写:此外,假如您将上面的正则表达式输入到您喜爱的编程言语中,这个表达式就会运转。这种行为的一致性是因为正则表达式自身便是一种嵌入式言语,它由POSIX界说。

运用S-expression来界说正则表达式。上面的正则表达式能够表明为:

(seq bos "f"(+ "o") (* (submatch "bar")) eos)

咱们还有一个随处可见的嵌入式DSL:数学表达式。每个程序员都知道下面的表达式的意义:可是,Racket程序员很少运用SRE。它们太长并且难以记住。

(1 + 2) * (3 / 4) - 5

你不能把编写HTML称为编程数学表达式自身并不能开发风趣的程序。咱们需求将它们与其他言语结构相结合。但与正则表达式相同,这是契合人体工程学和有用的考虑要素。数学表达式有自己的符号和意义,人类和核算机都能够了解,因而它也是一种独自的嵌入式言语。

不能将 HTML 称之为编程

我以为编写HTML便是编程。我以为HTML(还有正则表达式和数学表达式)应该被以为是根本编程言语。这就意味着编写HTML(还有正则表达式或数学表达式)都应该被以为是根本编程。

关于上面的观念你没有必要太介意。假如有谁只知道HTML和算术,就大吹牛皮地在LinkedIn大将自己标榜为“程序员”的话,咱们都会觉得这很过火。这其实是别的的一个论题,即咱们一般所说的“程序员”一词在作业商场中所代表的意义。但这不是咱们在这儿需求重视的问题。

图灵完整性

前面我对编程言语的解说,假如你觉得不太满足,这或许因为你以为一个真实的编程言语有必要能够表达一切或许的算法-也便是说,它有必要具有图灵完整性。

我了解咱们为什么这么想。因为每一种通用编程言语都具有图灵完整性。

问题在于图灵完整性是一个比较低的标准。这仅仅衡量言语的一个技能指标,可是它并不决议实践国际中的言语应该是什么样的。例如,正则表达式也不具有图灵完整性,可是它却具有较高的运用价值,因为它们用最少的符号表达了具有广泛意义的算法。HTML也不具有图灵完整性,但它却能有效地操控浏览器的展现和行为。与正则表达式和HTML构成显着比照的是bf言语。它尽管具有图灵完整性,可是,即便是最简略的使命也需求许多难以了解的代码。

成为言语的约束条件

到现在为止,我对编程言语的界说还没有包含悉数的内容:

言语是接口

在前面的部分,我将编程言语界说为人与核算机之间进行信息交流的前言。依照这个界说,言语也就水到渠成的能够被称为接口。

这也是我关于言语自身的第二个界说:即面向言语的编程,从本质上奥迪a8l讲便是接口规划技能。假如您喜爱习气接口技能,您也就会喜爱上LOP。假如你不习气接口技能,你也还或许喜爱LOP,因为它能够帮您完结某些其他办法无法完结的接口。

谈到言语自身是接口的时分,我最喜爱举得比方是brag。它是一种用Racket界说的解析器生成言语。假如您从前运用过相似lex或 yacc一类的东西,您就知道咱们是想依据BNF语法生成一个解析器。举个比方,一个bf言语的BNF语法可所以下面这样:学英语软件

bf-program : (bf-op | bf- loop)*

bf-op : ">"| "<"| "+"| "-"| ".until,@程序员,为什么选择 Racket 言语?"| ","

bf- loop: "["(bf-op | bf- loop)* "]"

有了brag,咱们就不需求这样繁琐。在创立解析器的时分,咱们只需像下面这样将#lang brag句子添加到文件中,BNF语法就会被奇特地转换为bra代码:要运用通用言语创立解析器,咱们有必要将这个语法转换为一系列本机代码。until,@程序员,为什么选择 Racket 言语?

#lang brag

bf-program : (bf-op | bf- loop)*

bf-op : ">"| "<"| "+"| "-"| "."| ","

bf- loop: "["(bf-op | bf- loop)* "]"

即便有解析器的生成器,这自身也是一项繁琐却没有意义的作业。咱们现已注明晰语法,为什么还要这样做呢?

这是我最喜爱举的一个LOP的比方,因为它比其skp它冗长的做法好许多。如quarter果运用通用言语,这种接口根本上是不或许完结。便是这么简略!编译之后,该文件将生成一个名为parse的函数,该函数就能够完结对应的BNF语法。

可是面向言语的程序员都会这样做。

言语作为接口的优势

这让我想到了我的第三个也是最终一个关于言语的界说,即在一切的接口中,言语具有它共同的优势。您别嫌烦,我发现LOP在下面这些情况下很有优势:

1. 当你想创立一个可供不太娴熟的程序员、非程序员或懒散的程序员们运用的接口的时分。多说一句,您千万不要轻视懒散的程序员数量。

例如,Racket有一个精心规划的Web运用程序库。可是您remember也能够运用web-server / insta快速发动一个简略的Web服务器:

#lang web-server/insta

( define(start request)

(response/xexpr

'(html (body "Hello LOP World"))))

Matthew Flatt在他的文章“在Racket中创立言语”中演示了一种可生成可播放文本的言语。与brag相同,它看起来更像是一个标准而不是一个程序,可是它的确能够运转:

#lang txtadv

===VERBS===

north, n

"go north"

south, s

"go south"

get_, grab _, take_

"get"

===THINGS===

---cactus---

get

"Ouch!"

===PLACES===

---desert---

"You're in a desert. There is nothing for miles around."

[cactus, key]

north

meadow

south

desert

2. 当你想更简练地表明的时分。正则表达式是一个比方。别的一个比方是我的DSLPollen,一种用于制造在线书本的言语(包含这一本)。Pollen很像Racket。它们显着的差别是关于Pollen,你需求以文本方式开端,并运用一个特别字符来表明Racket指令,这些Racket指令被履行并且将履行成果添加到文本内容中。本段的榜首部分便是这样编写的:

#lang pollen

When youbabycare want to simplify the notation. Regular expressions are one example.

My DSL ◊link[ "https://pollenpub.com"]{死刑Pollen} isa language formaking online books.

desert

Pollen会刺进有必要的标签并将这些内容转换为正常的HTML。运用Pollen,我能够像手艺编写HTML那样彻底地操控页面的内容,一同,又避免了手艺操作或许带来的过错,比方,不小心省掉了完毕符号。

简化表明的另一个比方是lindenmayer,它是一种用于生成和制造图形的言语,称为Lindenmayer体系,它能够制造下面的图画:

假如运用一般的Racket,Lindenmayer程序是这样写的:

#lang racket/base

( requirelindenmayer/simple/compile)

(define (finish val) (newline))

(define (A value) (display 'A))

(define (B value) (display 'B))

(lindenmayer-system

(void)

finish

3

(A)

(A -> A B)

(B -&大与小神会gt; A))

只需求更改文件顶部的#lang指令,您就能够将它进行简化成:

#luntil,@程序员,为什么选择 Racket 言语?ang lindenmayer/simple

## axiom ##

A

## rules ##

A -> AB

B -> A

## variables ##

n=3

该言语假定您现已了解了Lindenmayer体系。这种简化的表明办法能够很简略地完结您的要求。

3.当你想依据已有的表明法构建新的体系时。前面咱们讲到的brag,便是一个运用BNF语法作为源代码的DSL。

#lang brag

bf-program : (bf-op | bf- loop)*

bf-op : ">"| "<"| "+"| "-"| "."| ","

bf- loop: "["(bf-op | bf- loop)* "]"

还有另一个比方,假如测验过Pollen的人说“它的确很帅,但我仍是更喜爱Markdown。”。这也能够做到。pollen /markdown是Pollen的一个变种,它支撑Pollen的语义,一同又能承受一般的Markdown符号:

#lang pollen/markdown

When you want to simplify the notation. Regular expressions are one example.

My DSL [ Pollen]( "https://pollenpub.com") is a language for making online books .

经过将Markdown解析器与现有代码相结合,我只花了大约一个小时来创立这个改变的方式。你觉得快不快?

4. 当你想为其他言语创立中心格局的时分。JSON、YAML、S-expressions和XML都是界说数据格局的DSL。关于这些数据格局,关于机器来说,既可所以它们的输入,也可所以他们的输出。

在Beautiful Racket一文中,我供给了一种称为jsonic的教育言语。它答应咱们在JSON中嵌入Racket表达式,然后使咱们也能够用JSON进行编程。比方:

#lang jsonic

// a line comment

[

@$ 'nul绑女性l $@,

@$ (* 6 7) $@,

@$ (= 2 (+ 1 1)) $@,

@$ (list "array""of""strings") $@,

@$ (hash 'key-1 'null

'key-2 (even? 3)

'key-3 (hash 'subkey 21)) $@

]

它能够编译出下面的JSON内容:

[

null,

42,

true,

[ "array", "of", "strings"],

{ "key-1": null, "key-3":{ "subkey": 21}, "key-2": false}

]

5. 当程序的大部分是装备信息的时分。例如,Dotfiles就能够被以为是DSL。别的一个更杂乱的比方是由Jesse Alama开发的Riposte,它用于测验JSON格局的HTTP API:

#lang riposte

$productId :babyface酒吧= 41966

$qty := 5

$campaignId := 1

$payload := {

"product_id": $productId,

"campaign_id": $campaignId,

"qty": $qty

}

POST $payload cart/{uuid}/items responds with 200

$itemId := /items/0/cart_item_id

GET cart responds with 200

作为一种微型脚本言语,Riposte比一般的dotfile更智能。它躲藏了HTTP业务所需的一切中心代码,并让用户专心编写测验脚本。它能够使您专心于你关怀的内容。

为什么选择Racket?

人们关于LOP的一个常见批判是“为什么还要界说特定范畴的言语?这难道不比开发特定的程序库需求更多的作业吗?“

假如你有适宜的东西,那的确不会需求更多的作业。Racket就很不相同:它的规划初衷便是为了支撑LOP。因而,在Racket中完结DSL比其他办法更快、本钱更低,一同也更简略。例如,在本书的榜首篇教程中,我就向咱们展现了即便您从未运用过Racket,您也能够在一小时内界说一门言语。

从本质上讲,在Racket中每个DSL实践上都是一个源文件到源文件的编译器。它将DSL的符号和语义转换为对应的Racket程序。也正因为如此,Racket DSL的运转速度不会像用C言语编写的程序那样快。但它也使您能够在每个Racket DSL中拜访一切Racket的东西和库。所以您在程序履行功能方面的丢失,能够经过运用的便当来补偿。正是因为DSL方便运用,一同运用的本钱又低,所以它们运用的规模越来越广。

总而言之,运用DSL不一定比开发特定的程序库需求更多的作业。并且,正如咱们现已看到的,作为一个接口,一种言语能够完结特定的程序库无法完结的使命。

为什么选择宏?

因为Racket DSL会被编译为Racket,运用Racket的程序员需求编写一些语法转换器,将DSL符号转换为Racket。这些语法转换器被称为宏。实践上,宏能够被以为是Racket编译器的扩展。

Racket的宏很巨大、高雅,也是Racket的精华。在本书中,我所要点讲的都是Racket宏让人觉得风趣的当地。比较突出的包含下面两点:

是否有或许在Python中完结DSL?当然能够。实践上,我便是用Python写了我的榜首个DSL,我现在依然用这个DSL来完结我的类型规划作业。测验一次就够了。从那时起,我就一向运用Racket。

定论:充分利用LOP

我猜到现在,您或许会想到:

假如你想在用Racke干事之前得到许可,我觉得这不太可行。我以为你最好先做些作业,然后再解说它们的优点,这样会更简略。您能够与搭档谈论他们的作业并问询他们:“咱们怎样模仿API的改变并确认咱们做对了?“。关于这个问题的答案是:”写一个Riposte脚本。“那时我很清楚我所制造的[DSL]会带来真实的优点。我乃至没有故意地“推”Racket。我仅仅介绍DSL并向他们展现DSL能够怎样协助他们。

在我曾写的“为什么选择Racket?为何选择Lisp?”一文的结束,我说Lisp言语“让你有时机发现自己作为程序员和思想家的潜力,然后进步你对自己能够获得的成果的希望。”

LOP供给了类重庆小面似的时机:它能够进步咱们对编程言语能够做什么的希望。言语不是黑盒子。它们是咱们能够规划的接口。这样,咱们用程序能够做更多的作业。

假如你能找到更好的编程技能,主张你运用。现在我有了LOP&Racket,就不会再回到曩昔。

更多阅览材料

原文:https://beautifulracket.com/appendix/why-lop-why-racket.html

本文为 CSDN 翻译,转载请注明来历出处。

【END】

声明:该文观念until,@程序员,为什么选择 Racket 言语?仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间服务。
声明感谢您对我们网站的认可,非常欢迎各位朋友分享本站内容到个人网站或者朋友圈,
转转请注明出处:http://www.gmmod.com/articles/86.html
点赞 打赏

打赏方式:

支付宝扫一扫

微信扫一扫

扫一扫
QQ客服:111111111
工作日: 周一至周五
工作时间: 9:00-18:00