Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
Posted By: Shrewd @ 2018-01-03, 19:59
最早传入欧洲的炼金术文献之一大约就是这13句话的《翠玉录》,有人认为它是在公元前332年亚历山大大帝征服埃及以后,他的部下从“赫尔墨斯法老”的墓室里发现了雕刻在祖母绿上的《翠玉录》,然后把它带回了希腊。
这里说的赫尔墨斯法老并非真实存在过的法老,而是一位非常受后世神秘学学者及炼金术师们尊崇的伟大男神:三重伟大的赫尔墨斯,他的神性中叠加了埃及的透特、希腊的赫尔墨斯、罗马的墨丘利的特质,在后世神秘学与文学创作中十分流行。洛夫克拉夫特非常喜爱这位复合神格的男神。在他的克苏鲁神话小说里多次出现“三重伟大的赫尔墨斯”(通常还伴随着咿呀!咿呀!克苏鲁发糖!)。

在公元前332年马其顿人统治埃及后,希腊人与其后的罗马人逐渐把埃及神透特与赫耳墨斯联系起来。透特最初是位月神,代表着月相盈亏的循环,常见形象是人身朱鹭头或狒狒头。透特在许多埃及神话中都扮演着重要角色,因为月亮的盈亏对古埃及社会生活的方方面面尤其是节日与耕作十分重要,因此透特在古代占星术与天文学中具有非常重要的地位,并逐渐成为智慧、测量与规则之神。透特也是太阳神拉(Ra)的文书与参事,与妻子真理与秩序女神玛娅特一起并肩站在拉神巡游天空与地下世界的日之舟上,因此对于保护太阳与宇宙不被吞日巨蟒阿匹斯毁灭非常重要。透特还是奥西里斯主持的亡者审判仪式中灵魂品行操守的裁定者,也是众神间的调解者,能自由出入冥府与人间为众神、恶魔与人类调节纠纷。


不过透特最强大的地方在于他是魔法之神。埃及诸神都是魔法的使用者。他们必须以某种气氛为媒介施展魔法,同时也把魔法作为一种武器打败对手,在男性诸神中,最具魔力的就要数透特了。透特作为知识和执笔之神受到尊敬,他经常带着纸笔记录的书写工具。因为写下来的文字具有的魔力是如此之大,以致人们把透特看作象形文字的发明者,也就是魔力本身的发明者,据说最初的死者之书就是透特所写。希腊人进一步赋予他天文、占星、数学、地理、测绘、医药、植物学、神学、政府、字母、阅读、书写、雄辩的神职,认为他是人类与神灵一切学识的真正撰写者。


由于两者在各自的神系中都被视作书写、魔法、信使及与身后世界沟通的渡灵之神,希腊人渐渐把透特视作赫耳墨斯的对等神,透特的某个称谓“三重伟大的”也被希腊人赋予了赫耳墨斯(迄今出土的文献中,关于“三重伟大”的字样最早出现在公元前172年埃及的孟斐斯附近。在伊萨纳神庙里人们发现一段献给透特的咒文“伟大的,伟大的,伟大的透特”)。人们称他为赫耳墨斯·特瑞斯吉斯图斯(Hermes Trismegistus),意思是“三重伟大的赫耳墨斯” ,融合了赫耳墨斯、墨丘利与透特的神性。透特的圣城科姆恩也改名为大赫尔墨波利斯,人们后来从城市遗址中出土了数以万计献给透特的朱鹭木乃伊。

赫尔墨斯·特瑞斯吉斯图斯最后一次以人身形态出现在埃及的时间不明,但崇拜者们认为在最早期的埃及王朝时代就有他的身影,他现身的时间远比摩西古老,甚至有一些犹太学者认为亚伯拉罕就是从这位赫耳墨斯处学到魔法的。许多基督教学者把赫尔墨斯·特瑞斯吉斯图斯看作一名异教先知,他预测到基督教的到来。而基督教学者们出于自己的目的,把许多古代学者称作异教先知,如索罗亚斯特、柏拉图等。根据这种理论,赫尔墨斯·特瑞斯吉斯图斯或是摩西同时代的人,或是伊诺克(诺亚先祖)、诺亚与某位埃及祭司王的三位一体,即伟大的祭司、哲人与国王。

上述文字中的最后一句来自最早传入欧洲的炼金术文献之一,雕刻在祖母绿上的《翠玉录》。有人认为它是在公元前332年亚历山大大帝征服埃及以后,他的部下从赫尔墨斯·特瑞斯吉斯图斯的墓室里发现,然后把它带回了希腊。《翠玉录》上一共有13句话,被认为包涵了宇宙的三大智慧:炼金术、占星术与神术,大致是这样的:

当我走进洞穴,我看到了一块翠玉,上面写着字,那是从赫尔墨斯的双手间被书写出来。从那里我发现了以下这些文字:

1.这是真理,没有丝毫的虚假,是确凿之最确凿的真理。


2.要造出"唯一之物"的奇迹,须明白,那上界之物与下界相同,而下界之物也与上界无异。


3.那唯一的"造物主"创造了世间万物,所以万物皆诞生于这同一之源。


4.太阳是它(唯一之物)的父亲,月亮是母亲。


5.它在风的子宫里孕育,大地的乳房滋养了它。(同图四)

6.它是世界上所有奇迹之父,它有全能的力量。(另一个版本译作:它是宇宙中最完美的本源。它变成土时,其力量是无穷的。)


7.把它撒在泥土里,它能将泥土从火中隔离,也能让精妙之物从粗物中呈现出来。(同图5)

8.它能从地面飞升到天空,然后,它还能再降落到地面,积聚上界和下界的所有力量。(另一个版本译作:由地升上天,再从天国回到地,聚集上下界万物的力量。如此,你便赢了整个宇宙的荣光,使自身远离一切黑暗。)


9. 由此你将获得全世界最卓绝的荣光,所有的阴暗都将从你身边消散。


10.这是强大力量中的最强者,它能超越所有的精妙之物,也能渗透入所有坚固之体。(另一个版本译作:与任何力量相比,它是最强大的,因为它能超越一切精微之物,进入一切因体之中。


11.宇宙就是这样被创造出来。


12. 按照这一过程,从这"惟一之物"中产生了众多非凡的变化。同图9)

13.我之所以被称为三重伟大的赫尔墨斯,是因为我承担了全宇宙智慧的三重角色,关于"太阳的工作",这就是我要说的全部。(同图9)

翠玉录的情况便是如此。神秘学者们相信,除了《翠玉录》,身为智慧神圣之源的赫耳墨斯·特瑞斯吉斯图斯还曾写下成千上百极其古老的手稿,柏拉图的对话集中提到,在塞斯的妮特神庙中的密室内暗藏着9000年前的古卷。亚历山大港的克莱门特称,埃及人保存着赫耳墨斯所撰写的42章神圣文集《透特之书》,它是记录在莎草纸上的咒语与祭司就职仪式的一类文献,据说是由透特或赫耳墨斯·特瑞斯吉斯图斯亲笔写成的。42或许是指古埃及疆域中行省的数目,因而意味着“完整”。

希腊人尤其着迷于《透特之书》,这些晦涩难懂的文字被保存在亚历山大港的神庙中,内容都是关于宇宙与生命的奥秘。残留至今的残页是希腊罗马学者在托勒密与罗马统治时期作为炼金术重写的,所以里面又有埃及神话又有希腊罗马的内容,此外还有炼金术和占星术以及魔法的咒语,包括囚禁恶魔、活化物体或是占卜预言。其中以希腊医神阿斯克勒庇俄斯命名的章节中列举了一系列如何利用各类植物、宝石与气味召唤并将天使或恶魔的灵魂束缚在雕像中,使雕像能说话或辅助预言术的咒文。另一些章节则记录着如何构筑与活化这样的雕像,使之呈现中空状并在其中填入铭刻在金叶子上的魔法名字。

由于赫尔墨斯和透特的大规模融合发生在马其顿人征服埃及之后,时间年代较晚,所以《翠玉录》中有多少来自埃及魔法智慧未可知,甚至作者是不是假托赫尔墨斯之名也无从得知。但人们坚信这本书中的内容历史久远,乃至认为埃及的智慧正是通过它代代相传至今。这些内容极大地吸引了不同时代不同文化背景下的神秘学者与炼金术士,至今仍有不少追随者。
Comments: 6 :: View Comments

Posted By: annshark01 @ 2017-11-29, 04:24
众所周知,欧亚大陆各民族的上古文化中都有着诸多彼此相似的传承和信仰,像是冥界、天空神、风暴神、太阳战车、三身的命运女神、双子建国的故事、英雄(使用雷电)诛杀龙蛇的故事等等,不一而足,而这一点在古代日耳曼人所秉承的信仰中也不能例外。就宽泛的定义来讲,这一泛日耳曼文化下的成员囊括了居住在斯堪的纳维亚地区、信仰北欧多神教的古代北欧人,定居欧洲大陆地区、信仰西日耳曼多神教(或称洲际日耳曼多神教,或直接称为日耳曼多神教,并没有严格的分界,下同)的伦巴底人、阿拉曼人、撒克逊人、法兰克人等,迁徙到不列颠岛东南地区、信仰盎格鲁撒克逊多神教的撒克逊人、盎格鲁人和约特人,以及其他有着日耳曼多神教信仰的民族——而这一信仰体系下兼有保护神、雷神、闪电神、风暴神、橡树神、力量神以及衍生而来的丰饶神职能的神明,就是大多以其在北欧神话中手执短柄战锤的形象为人所知的托尔(Þórr),意为雷电。在北欧多神教以外的日耳曼信仰中,他的名字依据使用语言的不同也会有所改变,如古英语中的Þunor和古高地德语中的Donar。

如前所述,日耳曼民族事实上和其他的印欧大陆诸民族拥有着相近或是相同的源头,即是古代印欧多神教,而司掌雷电的英雄神托尔在诸神黄昏中杀死大蛇约梦冈德的故事同样也印证了上文所述及的“使用雷电的英雄诛杀龙蛇”的母题(通常称为Chaoskampf,意为“与混沌争斗”)——同样符合这一母题的神话组合尚还有着希腊神话中的宙斯与堤丰、印度神话中的因陀罗与弗栗多、波斯神话中的法里顿(或色莱陶纳,及戈尔沙斯帕)与阿兹·达哈卡、日本神话中的素盏呜尊与八岐大蛇、美索不达米亚神话中的安努(或马尔杜克)与提亚马特、赫梯神话中的忒舒卜与伊卢延卡,以及斯拉夫神话中的佩伦与贝勒斯;事实上,包含托尔与约梦冈德在内,上文的列表中唯一与雷电无涉的组合只有波斯神话中的法里顿与阿兹·达哈卡,然而前者在阿维斯塔中的形象——即是色莱陶纳——在印度的吠陀中仍然有着司掌雷电与天候的职能。

尽管这一现象印证了日耳曼信仰与其他印欧诸民族的信仰拥有彼此相近的源头,却也同时留下了一个疑问:与其他的雷神或是风暴神相比,托尔在使用的力量(更确切地来说,武器)上却与已知的大部分雷神或是风暴神都没有任何的共同点可言:宙斯有过握持雷箭(Keraunos,Thunderbolt)、双刃斧(Lybra)、长矛乃至于剑的形象,塔拉尼斯是雷箭,素盏呜尊是刀,佩伦是雷箭以及材质从石头逐渐演变为金属的箭矢、钉头锤(Mace)与斧,法里顿是牛头锤(Mace),乌柯是箭矢、斧、剑与锤子(Hammer),忒舒卜则是与其他中东神相类似的雷箭与斧——然而使用锤子(Hammer)作为武器的,除却临近斯堪的纳维亚的芬兰地区与爱沙尼亚地区共同的天空神,即是明显受到了托尔的影响、并且可能拥有铁匠起源的乌柯(即塔拉匹塔、托利)使用铁锤(Hammer)作为武器之外,就只有托尔这一柱神灵而已。

有别于语源为“锄”、“犁”的钉头锤(Mace),现存的主要文本(诗体埃达、散文埃达、挪威王传等)中对托尔的武器进行的指代全部都是“Hamarr”一词,也就是“铁匠用于铸造的生产工具”,是进行手工生产时所使用的道具,而非如钉头锤一般的武器;而除却指代托尔的武器之外,这个词语在上述的文本中所指代的便也只有铁匠的生产工具。那么这是否意味着托尔也同样拥有铁匠的特质呢?并非如此。其一,尽管铁匠在古典时代一向是珍贵的资源,但铁匠本身在传承中的地位却并不能够与代表战士的英雄神彼此相较:雷金在谋害西古尔德的阴谋败露后惨死在后者手下;西古勒密(或是斯瓦弗勒密)将矮人杜林和杜华林绑架,逼迫他们为自己铸剑;沃伦德(或是日耳曼传承中的威兰德)被尼特哈德绑架并残害,使得前者只得在囚禁之下为其铸剑;侏儒阿尔贝里希被狄特里希抓获,只得窃回为巨人打造的利剑为自己赎回性命;挑战狄特里希的威提格仅仅因为父亲是铁匠便激起了他的怒火,诸如此类,所在多有。其二,铁匠并不使用他们的生产工具进行战斗和报复;除却战士们通常使用的武器之外,他们更多地使用的是魔法、诅咒,或是其他常人无从具备的力量,比如杜林和杜华林为西古勒密所铸造的利剑上“每逢出鞘便须见血”,以及“注定带来三桩灾祸”的诅咒。故而铁匠的形象既不符合托尔作为英雄神和保护神的身份,也同样欠乏相关的文献作为对这一推测的有力支持。此外,与斧、枪、剑、矢这一类属于战士的武器,又或是农具这一类属于平民的生产工具不同,锤子是只属于工匠的生产工具,既没有在战争中取代过其他的武器,本身也并不具备任何仪式性的功能。

由此,综合托尔本身的地位,以及印欧神话中的雷神及英雄神所拥有武器的共性来看,任何人都有理由怀疑现今的托尔所使用的武器,或许并非是他作为泛日耳曼文化共同信仰的雷神时所使用的武器,事实上,一般认为作为源头的日耳曼信仰起源于日耳曼文化的铁器时代,紧随于青铜时代所盛行的太阳信仰消亡之后的公元前500年左右,而铁质的锤子更是直到公元后才于日耳曼地区出现,在这之前的日耳曼人所使用的替代品便只有大棒、斧头的钝面,以及石头。值得一提的是,“Hamarr”一词在可能存在的原始日耳曼语与原始印欧语中的语根即是意为“石头”、“锋利”或是“尖头”的“*(a)kam-”。从这里不难看出,作为铁匠生产工具的锤子,最初的指代事实上或许是石质的敲打工具,直到引入了更加简单的、用木杆与铁块接合的工具之后,才拥有了现今“锤子”的含义。

使用石头作为武器的雷神在拥有共同印欧神话背景的传承中并不是孤例:古代斯拉夫人认为雷电即是佩伦从高空中掷下的石块和石箭,并且认为箭石(一种酷似乌贼的古代生物)的化石、闪电熔岩(由闪电击中的泥土形成的长管状岩石)乃至于任何化石或是上古的石质器物皆是出自佩伦的手笔,并将之称为“佩伦石”、“雷箭石”、“佩伦之箭”或是“雷电的楔子”。事实上,相似的信仰并不仅止于斯拉夫人,从日耳曼文化盛行的斯堪的纳维亚地区、不列颠岛、中西欧乃至于美洲都有着与斯拉夫人相似的雷石(Thunderstone)信仰,这种广泛分布的信仰在日耳曼地区尤其流行,有些地方甚至一直流传到了今天;他们认为闪电是从高空落下的燧石,并将之收集起来,陈设在烟囱中、天花板中或是牛奶架上,以期保证家畜健康,规避厄运、疫病、怪物乃至于闪电本身。就如前文所述,托尔的名字——“Þórr”——实际的含义是“雷电”,而“托尔的锤子”在这一语境下的意义事实上即等同于Thunderstone一词,一如挪威语中的Torestein、荷兰语中的Dondersteen、丹麦语中的Tordensten,以及德语中的Donnerstein。近代瑞典学者龚纳尔·奥拉夫·海藤-卡瓦里乌斯认为,闪电在日耳曼文化中被广泛地认为是一块由托尔掷向地面的楔形石,而在闪电的落点附近找到的楔形石则被称作是Thorenvigg,意为“托尔的楔子”;这一观念的影子不仅能够从形如Thorvigge、Thornkile、Thorenvigg、Thornskil、Thorensten的瑞典名字,如Torestein、Torelod、Toreblyg的挪威名字等一系列拥有相近元素的当地名字当中得到印证,更还与拥有着印欧背景的其他神灵所固有的武器——用于投掷、发射或是倾泻的雷箭——彼此契合。

尽管雷石信仰在日耳曼地区中非常流行,但在某些地区却是例外,像是挪威以北的部分地区,以及完全由移民构成的冰岛——风暴,或者说伴随着频繁雷击的雷雨,在这些地区发生的频率并不如其他地区那么频繁,而这一传统便极有可能在冰岛随着时间的推移被彻底遗忘,甚至自初时起便没有得到过推行。从另一种意义上说,这或许也是托尔失去了“握持雷箭”这一与其他风暴神之间最大的共性的原因之一:现存的文本中,最为重要、也是最为古老的《诗体埃达》与《散文埃达》原稿中,前者的手稿出自冰岛,后者则完全由冰岛人斯诺里·斯图尔桑撰写;换言之,我们并没有了解托尔在冰岛以外的、更古老的、并且是日耳曼人眼中的形象的途径。话虽如此,我们仍然还是能够从字里行间所暗藏的一些隐喻中找到一些有关托尔武器形象的影子:

1] 在诗体埃达的Lokasenna一节中,托尔威胁洛基住口时是这么表述的:

QUOTE
Icelandic:
Þegi þú, rög vættr! þér skal minn þrúðhamarr,
Mjöllnir, mál fyrnema;
herðaklett drep ek þér halsi af,
ok verðr þá þínu fjörvi of farit.


English:
Silence, vile being! My hammer of might,
Mjollnir, shall spoil thee of speech.
I will strike that rock-head from off thy shoulders,
and soon will thy life-days be spent.
(摘自Olive Bray译本)

2] 在散文埃达的第一部分,Gylfaginning的四十八章中,托尔是这么对付他所举起的约梦冈德的:

QUOTE
Icelandic:
...En Þórr kastaði hamrinum eftir honum, ok segja menn, at hann lysti af honum höfuðit við hrönnunum...

English:
...But Thor threw his hammer after it, and they say that he struck off its head by the sea-bed...
(摘自Anthony Faulkes译本)

首先,锤子在一般观念中并不是用来“斩首”的武器;它可以轻而易举地把脑袋打碎,但却并不能够轻而易举地像这两处所提及的那样把脑袋“打掉”——只有带有利刃的武器才能做到这点。

3] 奥地利学者伊迪斯·马洛德认为托尔的锤子源于(或者等同于)史前时代的仪式用斧,如青铜时代的岩画中所使用的斧头;语言学家让·德·弗里也同样认为斧和锤子代表一种相同的器具,并称托尔的铁锤应当是自石斧演变而来;古文物学家希尔达·伊利斯·大卫森同样认为托尔最初的武器是一把斧子。以及,上述的所有学者给出的猜想都没有提供有效的论据。

4] 宙斯、马尔杜克、忒舒卜、乌柯、佩伦都有着持斧的形象。

尽管要依此论证托尔的武器最初是一把斧头并不充分,但却已经有足够的理由怀疑除去托尔最原始的武器——即是与其他印欧神话中的风暴神共通的雷箭——以外,托尔原本更还有着一把带有利刃的斧头。

综上所述,大致能够得出的结论有以下几点:
1] 托尔与其他拥有古代印欧多神教背景的风暴神拥有着相似或是相同的起源,这也致使他们拥有一些相近的性质;
2] 托尔最初的武器并不是铁锤,而是拥有楔形石性质的雷箭,这一点源自或是促进了日耳曼地区雷石信仰的盛行;
3] 托尔所使用的“锤子”这一武器最初的语源是“石头”;
4] 托尔可能拥有过一把与其他拥有古代印欧多神教背景的神灵相近的斧头作为武器;
5] 由于气候上的原因,雷石信仰并没能在冰岛地区得到发展,从而导致托尔所使用的武器中“石头”的性质被逐渐遗忘,并在当地最后被“锤子”彻底取代;
6] 日耳曼多神教在基督教的影响下渐趋式微,而保存最为完整的文本来自冰岛,最终导致托尔失去了原本手持雷箭的形象,成为了今天手执短柄战锤的英雄神形象。
Comments: 3 :: View Comments

Posted By: annshark01 @ 2017-10-28, 23:17
马拉加人所罗门·本·犹大·伊本·盖比鲁勒声称,他在自己位于萨拉戈察的居所中找到了每一个犹太学者苦觅而不得的阿莱夫,并用足四十首的诗篇描绘了他在阿莱夫中所亲眼目睹的景象,每一部都有比伯利恒所牧的羔羊更为隆盛的节数;他从无限和永恒的集合伊始,将迦南人最古老的语素缩聚在只有一点的球体中,留下十个质点的蔓生趋随在圣牛的颅骨之后;宇宙的投影在这里彼此并列,在穷尽的止境中映照出彼此的镜像,一侧是流逝前的片刻或是永恒,一侧是流逝后的刹那或是无限,或者彼此相反。

但众所周知,交流的前提是个体间相互首肯、彼此共有的经历,是亲历的、过去的、既定的事实,一如所有相信阿莱夫的学者都坚信,阿莱夫的存在并不具备足以被空泛的字母排布构成的语言加以描述和解释的特性。神秘学者指责他的诗篇只是意象、结构、空间和时序的有限罗列,是人为地将具体与抽象、实在与空想、普遍与象征刻意混淆的低劣产物;犹太学者则否认他对于根和枝的语言使用,否认他意图使用任何一种已知语言对智慧进行的描述和构造,甚至否认他对于隐藏、揭示和内在转变的一切认识。他们将他的认识归咎于虚幻和空洞的想象,是将实在的智慧与不切实际的幻想彼此杂糅、再用词藻文墨和奇技淫巧大肆污染之后貌似自洽的虚假印证。盖比鲁勒的笔是结果,而非起源,他们如是说道。

学界的声音起初尽管沸反盈天,却又很快便被盖比鲁勒的挚友兼保护人,耶库蒂尔·伊本·哈桑·穆塔瓦基勒·伊本·喀布鲁恩所镇压,以免招致盖比鲁勒的愤怒。事实上,尽管盖比鲁勒在向哈桑赠予的诗作中用浓重的笔墨表达了自己的谢意和对外界中伤的不屑,他的心中却委实燃烧着异乎寻常地灼热可怖的熊熊愤怒;但这火热的矛头所指向的却并非对他的作品极尽驳斥讥嘲的学者诸贤,而是既无力将阿莱夫加以描述,又无从将阿莱夫昭之于世的盖比鲁勒自己。于是他只得继续操起手中业已熟稔的喀兰,或是仍未抵达他指间的翎笔,用另外四十部的诗篇写下他的所见所闻:有阿拉伯海上一艘载着露水的驳船,有骆驼背负着异教的偶像在其上踱步,又有驮负哈里发成千上万手稿的另一个自己映在它水平的眼瞳中;有杀死了哈扎尔公主阿洁赫的两面镜子,一面快、一面慢,能够使人看到自己阖拢的眼睑;有仅止群星竞相罗布的夜晚,替代白月于银河绽放的灰色山茶,伊本·哈泰德从根茎的走向和花瓣的纹路中见到了真正的智慧,却只在自己的庭园中种植色泽明艳的蔷薇;有乘着夏日的尾巴,在象牙色的塔楼顶端摇着手扇乘凉的贵妇,她佩戴着用玛瑙、玉髓和珍珠串联而成的首饰,向脚下慕名而来的求婚者同时投掷玫瑰和便溺。

但他没有见到神。

他看到了数之不尽的人所见证的神:征服者的神在铁剑、枪尖和蹄踏中,在烟硝、喋血和横尸中;殉道者的神在十字架中,在刽子手的刀斧中,在朝向东南西北各方天地的天使脸孔所暗喻的无限中;马王们的神在青绿草海的利刃中,在骨质的项链、商人恐惧的面容、死去牲畜的肉和皮革中;流浪汉的神在睡梦中,在地牢中,在胃酸倒流的食道和他人的口袋中;虫豸的神在从天而降的汪洋中,在头顶徘徊起伏的群山中;但他没有见到自己的神。他想,如果能有其他人代他观看他所觅得的阿莱夫,或许就能有人告诉他,属于他的神究竟位处怎样的意象和实体之中;或许并非如此,或许对方只能像他过往的诗篇一般苍白无力地将并列的森罗万象用先后承接的时序毁坏,又或许他所见到的神,在他人看来不过只是疯汉、狂人和醉鬼口中的痴人说梦,又或许在他们眼中映出的神,就是他所日夜目睹的阿莱夫。但不论如何,就如他所抱憾的笔墨宣示的那般,他毋需,也不能够使他人观看他所寻得的阿莱夫;阿莱夫在他的梦中。

一个人即使并不熟悉盖比鲁勒,也不难从他人口中知道,盖比鲁勒其貌不扬,甚至算得上丑陋;幼年时期罹患的狼疮在他的脸颊、鬓角、下颌和脖颈处悉皆留下了永远无法磨灭的痕迹,像是被征服者的铁蹄踏平的国度中,隶属于他人的奴隶在裸露处和私密处,用火热的铁块烙制的记号。他生得矮小,即便是鹅卵石或是沙土铺设的道路上横卧的乞丐,又或是流连于他人的荷包和空巷死角的孤儿中的年长者,只要在他的面前鼓起胸膛、挺直腰板,便能够居高临下地俯视他那张丑陋的脸庞。即使他通过外表以外的天赋和美德赢得了伊本·哈桑的友谊,即使他并不需要如他所鄙夷或是鄙夷于他的众人一般用劳碌和汗水养活自己,他也难以相信他所追趋的智慧向他屡屡暗示的转变。他用炭、树胶和油脂调制的烟墨把犹太人的哲学付诸文字,写下将现实、光和整体与看似无关的起源间建立起联系的逻辑和理说,内心中徘徊的却只有结果带给他的最为有限的感触。时而,他会试图接受那些对他的著述严辞驳斥的学者意图堆砌的理论,但他所感受到的,又或是他希望感受到的,却并不是意识、壁垒、时序或是世界的层次,而是包裹在Adam Kadmon、Acilut、Beriya、Yecira和Asiya下的另外一种永恒。将活人的灵与肉献予太阳的民族认为,人会逐渐与他的境遇合二为一;换句话说,人就是自己的处境。

于是他不再观看阿莱夫;他让阿莱夫来观看他。

正是从这一天起,他的睡梦中响起了一个从未听闻过的声音;他看不到是谁,又或是用何种方式述说,却端的认为这就是阿莱夫传来的意旨;声音的主人用千千万万的声调向他述说闻所未闻的万万千千,然而这一切所耗费的却不过只是永恒与须臾之间的一个断点。他不再能看到红色的砂漠中竦峙着千重立柱的古都,不再能看到未婚的女郎手执长弓的模样,不再能看到黑色的蜘蛛所爬过的骨骸,更不再能看到泥海之中青铜王冠的去向;随之而来的,是与往日所见的一切似是而非的景象:有百年之后正在合力将一部阿拉伯著作翻译成拉丁文的亚伯拉罕·伊本·达乌德和多米尼库斯·古恩狄萨利努斯,译本的扉页上写有阿维斯布隆的名字;有千万年都未及陷落的神圣都城,有着乌鸦头颅的天使曾经来访,在嘁喳的啸叫中带走了犹太人的王,据说他们黑白驳杂的羽毛下、那被业已倾圮的连绵丘墟所埋藏的圣殿中,任何人都能找到只属于他们自己的神。

然后,他便看到了乐园。

乐园并不是这片土地的名字,声音的主人告诉他,这里也并没有土地;事实上,乐园之中空无一物。这里唯一为他留置的东西,便只有一个人。这是希伯来人,声音对他说,唯一的希伯来人,但盖比鲁勒却不知如何是好。他知道,只有外族人才会将希伯的儿女称作希伯来人;他的内心悸动,却不能知晓其中的意味。每一个夜晚他都能够看到乐园中的希伯来人,但每当他从阿莱夫的声音中醒来,三步并作两步地抓起书桌上横放的喀兰时,希伯来人的面容、体态、风度和着装便会在朦胧和暧昧中被霎时遗忘。他于是只能想象,就如那些犹太学者和神秘学者所指摘的那般;他前所未有地恳求他的保护人,向他索要他的想象所需的资金和材料。他知道,他无法从想象中知晓希伯来人真正的样貌,更无法知晓他内心的犹疑又是否会被希伯来人所印证;但他更知道,希伯来人决不是他的神,正如他并不是自己的神。

于是,他开始为自己的想象具以实体的形貌;他取来松石和油膏,取来面包和酒,取千只羊羔走过的牧场,取十弦的琴所奏出的一切音韵和旋律,取五块石头和胜过千千的万万,取人所忤逆背反的一切淫邪和荒诞;伊本·哈桑允诺了他,让雪花石膏用一百个白昼牧去了万只羔羊,只有十分之一活了下来,又让萨拉戈察的仆人弹奏弦瑟,他们的手指落在地上,使萨拉戈察成了伊比利亚的陷坑。他又取来基石和高台,取来十枚黄金和青铜熔铸的戒环,取来雅各的子民建立的国度赖以为生的智识,取来神从未有过的配偶的偶像,取来假的神、伪的神、错的神、旧的神的偶像;伊本·哈桑允诺了他,让征服者的子民学习他们所禁止的绘画和雕刻,又让犹太人、穆斯林、基督徒和异教徒交出他们的智慧,从他们的肩膀滚落的头颅积满了高及数千腕尺的剧场废墟,时至今日,已经没有人记得,那时这里的名字还叫做凯撒奥古斯塔。

希伯来人做成了;他像是一切犹太人的王。有油膏施洗他的头发,束发的带子是丝,是绸,也是亚麻和纸,上面绣着野蔷薇和薰衣草,梦中的声音说,这代表雍容和典雅;有陨铁的镯和戒环佩在他的指和腕上,又有白银、绿松石和黄玉的链子环着他的脚踝和脖颈,梦中的声音说,这代表骄奢和淫逸;有肩舆承载他的出行,抬杆是从东方迎来的香木,幕帘用黄金镀过,外壁却嵌满了红玉和天青石,脚夫的皮肤用染料涂成了明艳的古铜色,随着他手中权杖鞍前马后,又有黄铜和锡从杖头垂落,覆满他们行过的地方,梦中的声音说,这代表权力和权威;又有如山的羊皮卷和犊皮纸堆落在他的脚边,上面密密麻麻地书写着古往今来一切发生或未曾发生的事,梦中的声音说,这代表智识,却不代表智慧。

最后,梦中的声音告诉他,希伯来人拥有一切的过去,然而却并不会将过去的一切堂而皇之地昭示出来;他的过去潜藏在旅人的耳语中,在手掌和树墩的轮廓中,在异族的战士胸腹和肱骨上用油彩涂绘的纹路中,在苍天和地平交汇的最初也是最后的一刻所言说的字句中。他从梦中惊醒,迎接他的却是手执权杖的希伯来人,后者的律法和权威为萨拉戈察所不容:在开阔地中沐浴的女子和孩童不被他所准许,在呼喝声中被一手投入盘踞着毒蛇的坑洞;王公和贵族向他请求宫中女侍的嫁娶,却被他当作觊觎王位而身首异处。没有人再在月亮露面的夜中吟唱欢愉或冷峻的歌谣,小酒馆供应的蜂蜜烤肉变成了青蛙、蚯蚓和牛股骨的浓汤;人们将自己想象成被征服的民族拥立的王,终日只知道如何用赋税和进贡取悦征服者的铁蹄和弯刀,或是用勒索和敲诈填饱自己空空如也的私囊。原来王是只会居住在殿陛和廊柱之间的。

肉和血做成的希伯来人向盖比鲁勒高举权杖,要将他也变作王城的一份子,后者惊出了一身冷汗,伸手抹去了希伯来人额头间用想象书写的阿莱夫,希伯来人便立时烟消云散,成了盖比鲁勒脚边的面包屑和酒糟。

于是,盖比鲁勒再次找到了伊本·哈桑,索要他的想象所需的资金和材料;他取来黏土,取来异教神干结的血液,取来盐柱,取来被焚烧的牛、羊、驴、骆驼、侍女和王,取来硫磺和烟熏的火种,取来幼童、刀斧和祭具;保护人允诺了他,将萨拉戈察的半分用柴垛、稻草和动物油脂烧毁,冲天的燃焰有着日暮的颜色,将青银交织的天空染成炭火的余屑。

希伯来人做成了:他像是一切犹太人的父。他的发色灰白驳杂,面容却像耄耋之年的老者,眼角、额头、脸颊、下颌、脖颈、胸腹,周身的每一片肉和骨都有着形似迷宫的皱褶和纹路,据说没有人能够免于陷溺其中,梦中的声音告诉他,这代表指引和歧途;旅途和疲惫用泥土将他的肌肤涂满,每每踏出一步,便会从中落下足以参天的大树亟待生养的种子,有幼童乘着攀升的枝扶摇直上,梦中的声音告诉他,这代表富足和末路;他住在商路和旅路中,住在陆路和水路中,只有一头骆驼驮负他的帐篷、口粮、纸卷、坐毯和水,他邀请往来的行人和车队到他的凉亭中做客,为他们提供可口的无酵饼,这是素祭时所用的食物,梦中的声音告诉他,这象征着许诺和信仰;他使遇到的一切女子为他生育,又使遇到的一切孩童做他的子嗣,让他的后裔之数更胜过天上的繁星,梦中的声音说,这代表生息,却不代表昌盛。

最后,梦中的声音告诉他,希伯来人是先知,又或是假先知,凡夫俗子却并无大能去辨别个中的异同,要他睁眼去看。盖比鲁勒醒来,慌忙去寻找徘徊城外的希伯来人,恐惧他会将萨拉戈察变成又一座王的圣城,但迎接他的却是一顶不逾十尺的帐篷。九十九个拉比、穆斯林和犹太学者环坐在帐篷的边沿,一面舔舐指尖无酵饼的碎屑,一面聆听帐篷正中希伯来人的布道中掩藏的智慧;他们伸出双手欢迎盖比鲁勒的到来,亲吻他的面颊和胡须,为自己过往对他的否定和中伤表示深重的忏悔。于是所有的人都加入到了希伯来人的行列中;他们走过被伊本·哈桑焚毁过半的萨拉戈察,将希伯来人泥垢中的种子一一种植,使这里成为了较焚毁之前还要更为宏伟壮阔的城。希伯来人随后便去往了另外半分的城,去劝诫世人弃绝荒淫和堕行:他向哑子用手语传达在十三根立柱的行宫前乘凉的人脑海中的想法,教授麻风病人用止血带捆缚手臂和大腿的方法,买下白日做梦的人用大理石做成的桌布;人们看到,或是想象他与树木、微风和砂砾对话,并试图打断他,但也许希伯来人想象他打断了想要将他打断的人,于是人们只好闭上眼睛,假装注意不到希伯来人,假装听闻不到他的呼吁。后来,在一个夜里,希伯来人摇醒睡梦中的盖比鲁勒,要他带着自己珍视的一切逃离这半爿城市;他说,硫磺和火雨很快就会从天而降,要将半座城市夷作焦黑炙热的白地。原来先知是只会住在受选的人中间的。

盖比鲁勒惊出了一身冷汗,向希伯来人乞求慈悲;可希伯来人的子嗣太多太盛,使他早已忘记软下心肠是怎样的一种行径。于是,希伯来人就说,你还没有见到神,我又怎能离开你?盖比鲁勒只得闭上眼睛、堵住耳朵,设法抹去了希伯来人额头间用想象书写的阿莱夫,希伯来人便立时烟消云散,成了盖比鲁勒脚边的羊羔和炭火。他听到希伯来人说:他必杀我,我虽无指望,然而我在他面前还要辨明我所行的。

盖比鲁勒仍旧苦苦恳求着伊本·哈桑;而他的保护人也仍旧一次次地允诺了他。他造了手足、儿女、官员、商人、脚夫、娼妓,造了赤金、山铜、蓝宝石、红玉、孔雀石、琥珀、玉髓,但那仍然不是他在梦中见到的希伯来人;但那形象终究在他的脑海中一天比一天地来得清晰了。时而,他会怀疑自己所造的是否只是他的睡梦;或许并非是阿莱夫在他的梦中,而是他在阿莱夫的梦中。

但萨拉戈察的居民并不在乎这些。他们早已受够了伊本·哈桑对盖比鲁勒的纵容;他们厌倦了用亚麻布编织的楼阁、用羊皮纸和犊皮卷铺设的街道,厌倦了在住宅内洗浴的男女只要伸手就能摘到的熟透柿子,厌倦了公共浴场内错综复杂地排放着热气和白雾的管道,厌倦了苏醒之后发现自己身处耶路撒冷或是雅法。于是,在一个没有月亮的夜晚,几个曾是年轻人的老者握着从喜爱盖比鲁勒的铁匠炉中取来的匕首,他们的手腕有着硫磺的颜色,脸上的褶皱和老年斑中书写着往昔的集市上粟米和柴火的价格;伊本·哈桑没能预料到他们的到来,只好将自己的性命交到了他们的手中。

他们得手了;尽管他们迫不及待地想要将盖比鲁勒逐出萨拉戈察,但胜利者的尊严使他们的举手投足之间都流露着居高临下的优渥,于是他们叼起白象牙的烟斗,大度地为盖比鲁勒保留了向他的挚友兼保护人最后进行一次慰问的权利。这或许是因为他们还想再次阅读盖比鲁勒的诗作;原本的八十部如今已经成了灰烬,或是被无数只手翻阅过后的碎屑。然而盖比鲁勒留下的却只有喟叹;他已经不再写诗了。原本从他的唇齿和喀兰中源源不绝地倾泻而出的文墨和学识如今已然不知去向,只有起讫互异、不可理喻的狂言和乱语环伺在盖比鲁勒的左右;有心人将这些不知起始和结束的文句摘抄下来,用鸽子或是乌鸦的智慧彼此串联,再谎称是盖比鲁勒未能流传于世的诗作,一共编纂成了十八部。

盖比鲁勒最后还是离开了萨拉戈察;活人、牛、羊和骆驼在他的背后欢欣雀跃,用松香和油脂熬煮庆贺的胶浆。但这一切却都于他无碍;他想,他已经知晓了希伯来人究竟有着如何的样貌,吃怎样的面包和酒,又会如何在冒着夜雨狂奔的青年踏过的石板上留下足迹。他从满是饥饿和疲惫的旅途中取来泥土,从中拣去蝎子、蜥蜴和蚂蚁的尸体;他又从膏雨、穷人和乞丐的施舍中取来透明的水,从中拣去人的骨血;阿莱夫允诺了他,于是他将泥土和水混合成泥巴,有记写天命的黏板那样柔软,却又如晚餐侍奉的面包那般坚硬。

希伯来人就快要做成了;他不像是盖比鲁勒见过的任何一个人所具有的形貌,只比最初的人最后的体态多出仅止一根的肋骨;梦中的声音允诺了他。他没有面庞,梦中的声音赞许地说道;他没有衣装,梦中的声音赞许地说道;他没有贵贱,梦中的声音赞许地说道。盖比鲁勒知道,这就是他在乐园中见到的希伯来人;只要赋予他一个名字,他就能够回到乐园,因为希伯来人原就是住在乐园中的。

最后,梦中的声音最后一次地告诉了他希伯来人的名字。盖比鲁勒从微睡中惊醒,步履蹒跚地走向希伯来人,想要将躯体中最后的一口灵气吹入希伯来人的体内,然后跌倒在了仍是泥土的希伯来人脚下。

据说盖比鲁勒最后死在了巴伦西亚:人们在一个没有月亮的夜晚纷纷赶来,却鲜有哪怕一位拉比、穆斯林、犹太学者或是神秘学者拥有足够的勇气踏入他的居所,只好找到脚夫、农民、木匠、石工来为他们代劳;这些人或是斩钉截铁地坚称破落的茅屋中寓居的是千年不落的圣城耶路撒冷,或是言之凿凿地认定他们造访的地方就是有着天堂、伊甸、桃源、阿卡狄亚和伊利西昂别名的乐土,是他们梦想中的乌托邦;一方拿出泪痕从未干涸的哭墙泥砖佐证,另一方的手中却空空如也,因为乌托邦本来就是没有任何事物的地方。他们翻箱倒柜地游走在雕栏和画栋之间,却既没能找到王国和王冠外的尽头,也没能找到盖比鲁勒的尸体;只有屈指可数的几许头脑察觉到了地板和穹顶间所弥留的样貌中氤氲的意象,但他们却不敢言说。那是拥有约柜形状的地球上最后也是最初的人所应当具备的形貌;他汇集着露水、白月、泥土、大卫王的盾、正逆交垂的树、供奉着过去未来一切神祇的高台和神殿,是从第一个傍晚自盖比鲁勒双手的机巧伊始,至第二个傍晚于盖比鲁勒尸体的沉重结束,有圣油在他的额头书写九十九个名字的神所欠缺的真名。摩西·本·迈蒙说,梦中若是看不到述说话语的人,话语本身却又清晰可辨,这些言语便是神圣的,但盖比鲁勒却没能在希伯来人的梦中将自己的名字赋予他将要成为的希伯来人。睿智的头脑尽管看到了被盖比鲁勒尸体的重量损毁的希伯来人,却不敢对没能成为希伯来人的盖比鲁勒和没能成为盖比鲁勒的希伯来人之间的区别擅加评断;他们不敢妄言死去的究竟是盖比鲁勒,抑或是希伯来人,只好顾左右而言他,告诉世人是撰写了生命源泉的阿维斯布隆从阿莱夫中寻得了树的枝杈,而将追逐希伯来人的愚行悉数留给了马拉加人所罗门·本·犹大·伊本·盖比鲁勒,留给了他仅存于世的两部空洞的诗篇。
Comments: 0 :: View Comments

Posted By: TheFool @ 2017-08-08, 13:58

# (如何(用Python)写一个(Lisp)解释器)

- 作者:Peter Norvig
- 翻译及少量魔改:TheFool

这篇文章有两个目的:

1. 通用地介绍如何实现计算机语言的解释器。
2. 介绍如何利用Python实现Lisp方言Scheme的一个子集。

我将我的这门语言以及解释器称之为Lispy。数年之前,我演示了如何用Java和Common Lisp写Scheme解释器。这次我的目标是以一种尽可能简明的方式演示Alan Kay所谓的“[*Maxwell's Equations of Software*](http://www.righto.com/2008/07/maxwells-equations-of-software-examined.html).”

为什么这很重要? [Steve Yegge说过](http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html) :“若你不知道编译器(或解释器)是怎么工作的,那你就无从得知计算机的运转原理。”

## Scheme程序的语法和语义

一门语言的语法(syntax)指的是字母排列成正确表达式或声明的顺序;语义(semantics)则是这些表达式或声明的意义。例如在数学和许多编程语言之中,一加二的语法是“1 + 2”, 语义则是将加法运算符应用于数字1和2之上,得到结果3。我们将计算表达式的值称之为求值(evaluating);“1 + 2”求值得到结果3,我们将之记为“1 + 2” => 3。

Scheme的语法与你熟悉的大部分语言不同。例如:

```java
// Java
if (x.val() > 0) {
fn(A[i] + 1,
return new String[] {"one", "two"});
}
```

```lisp
;; Scheme
(if (> (val x) 0)
(fn (+ (aref A i) 1)
(quote (one two)))
```



Java有大量不同的语法约规(关键字、中置操作符、三种括号、操作符优先级、点、引号、逗号、分号等等),而Scheme的语法则简单很多:

- Scheme程序中只有表达式。表达式和声明之间并无区别。
- 数字(例如 1)和符号(例如 A)被称之为原子表达式(atomic expression);他们无法被拆分成更小的表达式。这部分和Java类似,但在Scheme中,诸如 + 和 > 这种操作符也被认为是符号(symbol),处理方式与A或是fn这种符号别无二致。
- 除此之外的一切都是列表表达式(list expression):以“(”为首,“)”为尾,中间包括着零个或更多表达式。列表的第一个元素决定了它的含义:
- 若第一个元素是关键字,例如(if ...),那这个列表是一个特殊形式(special form);特殊形式的意义取决于关键字。
- 若第一个元素并非关键字,例如(fn ...),那这个列表则是函数调用。


Scheme之美在于她的简洁性:整个语言由5个关键字和8个语法形式构成。相较之下,Python有33个关键字和110个语法形式,Java有50个关键字和133个语法形式。Scheme中的大量括号初看起来可能显得古怪陌生,但括号为Scheme提供了简洁性和一致性。(有些人开玩笑说Lisp的意思是“大量又蠢又烦的括号(Lots of Irritating Silly Parentheses)”;我觉得应该是“Lisp拥有纯净的语法(Lisp Is Syntactically Pure)。”)

在这篇文章中我们会涉及到Scheme中所有的关键点(除了一些琐碎的细节)。但罗马城不是一天建成的,我们需要分两步。首先,我们会定义一个相对简单的语言,再在它的基础上定义一个几近完整的Scheme语言。

## 1号语言:Lispy计算器

Lispy计算器是Scheme语言的一个子集,它只包含五种语法形式(两种原子,两个特殊形式,以及过程调用)。只要你习惯了Lisp前置运算符的古怪语法,你就能利用Lispy计算器干一般计算器的活。你还能干一般计算器干不了的活:使用"if"表达式进行条件判断以及定义新的变量。我们来举个例子,以下是一个计算圆面积的程序,圆的半径为10,计算公式为πr^2:

```lisp
(begin
(define r 10)
(* pi (* r r)))
```

下面这张表列举了所有可用的语法形式:

| 表达式(expression) | 语法(syntax) | 语义(sematics)及范例 |
| ------------------------ | ---------------------- | ---------------------------------------- |
| 变量引用(variable reference) | *var* | 该符号被认为是变量名;它的值是变量的值。范例:r => 10 (假设我们之前将r定义为10) |
| 字面常量(constant literal) | *number* | 一个数字(number)求值得到它自身。范例:12 => 12 或 -3.45e+6 => -3.45e+6 |
| 条件(conditional) | (if *test conseq alt*) | 对*test*进行求值;如果结果为真,对*conseq*进行求值并返回结果;否则对*alt*求值并返回结果。范例:(if (> 10 20) (+ 1 1) (+ 3 3)) ⇒ 6 |
| 定义(definition) | (define *var exp*) | 定义一个新的变量,将*var*的值定义为*exp*求值得到的结果。范例:(define r 10) |
| 过程调用(procedure call) | *(proc arg...)* | 如果*proc*不是if, define或quote其中之一,那它就被认为是一个过程(procedure)。对*proc*和所有的*args*求值,然后将proc过程应用于所有的args之上。范例:(sqrt (* 2 8)) => 4.0 |

在表中“语法”一列中,*var*必须为一个符号,*number*必须为一个整数或浮点数,其他斜体字可以是任何表达式。其中的“*arg...*”表示零个或更多个"*arg*"。在“真正”的Scheme中,begin是一个语法关键字,但在这个Scheme实现中,它只是一个普通的函数。

## 语言解释器做些什么?

一个计算机语言的解释器分为两部分:

1. **分析(parse)**:解释器的分析部分将程序以一串字符的形式读入,依照语法规则(*syntactic rules*)验证其正确性并将程序转换成一种内部表达形式。在一个简单的解释器中,内部表达形式是一个树形结构,人们一般将其称之为*抽象语法树 (abstract syntax tree)*。抽象语法树的结构和程序中层层嵌套的声明及表达式非常相近,几乎可以说是完美对应。在编译器之中往往存在多个内部表达形式,一开始先转换成抽象语法树,随后再转换成可以直接被计算器执行的指令序列。Lispy的语法分析器由parse函数实现。
2. **执行(execution)**:内部表达形式被按照语言的语法规则进行处理,以此来进行计算。Lispy的执行函数叫做eval (注意,这会覆盖Python的同名内置函数)。

以下是对解释器工作流程的一个简单的演示:

```
程序 ---> [parse] ---> 抽象语法树 ---> [eval] ---> 结果
```

下面这个例子则展示了我们希望eval和parse实现的功能:

```
>> program = "(begin (define r 10) (* pi (* r r)))"

>>> parse(program)
['begin', ['define', 'r', 10], ['*', 'pi', ['*', 'r', 'r']]]

>>> eval(parse(program))
314.1592653589793
```

## 分析:parse, tokenize 以及 read_from_tokens

依照传统,分析被分为两个部分:

1. 词法分析(lexical analysis):在这一部分中,输入的字符串被拆分为一系列的token。
2. 语法分析(syntactic analysis):将token汇编为抽象语法树。

Lispy token们由括号,符号和数字组成。由许多用来进行词法分析的工具(例如Mike Lesk和Eric Schmidt写的lex),但我们只需要用到一个十分简单的工具:Python的str.split函数。tokenize函数接受一个字符串,并在括号周围加上空格;随后调用str.split来得到一个由token组成的列表:

```python
def tokenize(chars):
"将字符串转换成由token组成的列表。"
return chars.replace('(', ' ( ').replace(')', ' ) ').split()
```

```
>>> program = "(begin (define r 10) (* pi (* r r)))"
>>> tokenize(program)
['(', 'begin', '(', 'define', 'r', '10', ')', '(', '*', 'pi', '(', '*', 'r', 'r', ')', ')', ')']
```



我们的parse函数接收一个字符串作为输入,然后调用tokenize函数获得一个由token组成的列表,再调用read_from_tokens来将token列表汇编成抽象语法树。read_from_token函数会查看第一个token,如果是“)”,那就报出一个语法错误。如果是“(”,那我们就开始构建一个由子表达式组成的列表,直到匹配到对应的“)”。所有非括号的token必须是符号或者数字。我们会让Python来识别它们之间的区别:对任何一个非括号token,先尝试将之转为整数,若失败则尝试转为浮点数,若还是失败,则转为符号。下边是parser的代码:

```python
def parse(program):
"从字符串中读取Scheme表达式"
return read_from_tokens(tokenize(program))

def read_from_tokens(tokens):
"从一串token之中读取表达式"
if len(tokens) == 0:
raise SyntaxError('unexpected EOF while reading')
token = tokens.pop(0)
if '(' == token:
L = []
while tokens[0] != ')':
L.append(read_from_tokens(tokens))
tokens.pop(0) # pop off ')'
return L
elif ')' == token:
raise SyntaxError('unexpected )')
else:
return atom(token)

def atom(token):
"数字转为对应的Python数字,其余的转为符号"
try: return int(token)
except ValueError:
try: return float(token)
except ValueError:
return Symbol(token)
```

parse函数的工作方式如下:

```
>>> program = "(begin (define r 10) (* pi (* r r)))"

>>> parse(program)
['begin', ['define', 'r', 10], ['*', 'pi', ['*', 'r', 'r']]]
```

我们还需要决定一下各种Scheme对象在Python中的表示方法:

```python
Symbol = str # Scheme符号由Python str表示
List = list # Scheme列表由Python list表示
Number = (int, float) # Scheme数字由Python的整数或浮点数表示
```

好了!定义eval的准备工作基本都做好了。但我们需要先了解更多的概念。

## 环境(Environments)

eval函数接受两个参数:一个我们想要求值的表达式x,还有一个环境env,x将在这个环境中被求值。*环境*指的是变量名和他们的值之间的映射。eval默认会使用全局环境(global environment)进行求值,全局环境包含着一系列的标准函数(比如sqrt, max和 * 这类操作符)。这一环境可以用用户定义的变量拓展,语法为 (*define variable value*)。我们可以用Python自带的字典来实现环境,字典中的键对为{变量: 值}的形式。

```python
import math
import operator as op

Env = dict # 环境是{变量: 值}之间的映射

def standard_env():
"一个包含着一些Scheme标准过程的环境。"
env = Env()
env.update(vars(math)) # sin, cos, sqrt, pi, ...
env.update({
'+':op.add, '-':op.sub, '*':op.mul, '/':op.div,
'>':op.gt, '<':op.lt, '>=':op.ge, '<=':op.le, '=':op.eq,
'abs': abs,
'append': op.add,
'apply': apply,
'begin': lambda *x: x[-1],
'car': lambda x: x[0],
'cdr': lambda x: x[1:],
'cons': lambda x,y: [x] + y,
'eq?': op.is_,
'equal?': op.eq,
'length': len,
'list': lambda *x: list(x),
'list?': lambda x: isinstance(x,list),
'map': map,
'max': max,
'min': min,
'not': op.not_,
'null?': lambda x: x == [],
'number?': lambda x: isinstance(x, Number),
'procedure?': callable,
'round': round,
'symbol?': lambda x: isinstance(x, Symbol),
})
return env

global_env = standard_env()
```

## 求值:eval

现在,我们已经做好了实现eval函数的准备。来让我们重新看一遍Lispy计算器的语法形式表以加深一下记忆:

| 表达式(expression) | 语法(syntax) | 语义(sematics)及范例 |
| ------------------------ | ---------------------- | ---------------------------------------- |
| 变量引用(variable reference) | *var* | 该符号被认为是变量名;它的值是变量的值。范例:r => 10 (假设我们之前将r定义为10) |
| 字面常量(constant literal) | *number* | 一个数字(number)求值得到它自身。范例:12 => 12 或 -3.45e+6 => -3.45e+6 |
| 条件(conditional) | (if *test conseq alt*) | 对*test*进行求值;如果结果为真,对*conseq*进行求值并返回结果;否则对*alt*求值并返回结果。范例:(if (> 10 20) (+ 1 1) (+ 3 3)) ⇒ 6 |
| 定义(definition) | (define *var exp*) | 定义一个新的变量,将*var*的值定义为*exp*求值得到的结果。范例:(define r 10) |
| 过程调用(procedure call) | *(proc arg...)* | 如果*proc*不是if, define或quote其中之一,那它就被认为是一个过程(procedure)。对*proc*和所有的*args*求值,然后将proc过程应用于所有的args之上。范例:(sqrt (* 2 8)) => 4.0 |

来和eval的代码对比一下,是不是觉得很像?

```python
def eval(x, env=global_env):
"对在某个环境下的表达式进行求值"
if isinstance(x, Symbol): # 变量引用
return env[x]
elif not isinstance(x, List): # 字面常量
return x
elif x[0] == 'if': # 条件
(_, test, conseq, alt) = x
exp = (conseq if eval(test, env) else alt)
return eval(exp, env)
elif x[0] == 'define': # 定义
(_, var, exp) = x
env[var] = eval(exp, env)
else: # 过程调用
proc = eval(x[0], env)
args = [eval(arg, env) for arg in x[1:]]
return proc(*args)
```

搞定!来试试吧:

```
>>> eval(parse("(define r 10)"))
>>> eval(parse("(* pi (* r r))"))
314.1592653589793
```

## 交互:来做一个REPL

一直打“eval(parse(...))”的话即便是耐心再好的人也会嫌烦。Lisp最伟大的遗产之一就是引入了read-eval-print loop(读取-求值-输出 循环,缩写为REPL,译者注)。运用REPL,程序员们可以即时地读取、求值、输出,而不用麻烦地先编译再运行。我们先定义一个名为repl的函数以实现这个功能,然后再定义一个schemestr函数来输出Scheme对象的字符串表示。

```python
def repl(prompt='lis.py> '):
"REPL的懒人实现。"
while True:
val = eval(parse(raw_input(prompt)))
if val is not None:
print(schemestr(val))

def schemestr(exp):
"将一个Python对象转换回可以被Scheme读取的字符串。"
if isinstance(exp, List):
return '(' + ' '.join(map(schemestr, exp)) + ')'
else:
return str(exp)
```

老样子,做完以后来试试:

```
>>> repl()
lis.py> (define r 10)
lis.py> (* pi (* r r))
314.159265359
lis.py> (if (> (* 11 11) 120) (* 7 6) oops)
42
lis.py>
```
Comments: 2 :: View Comments

Posted By: Kiw @ 2016-12-20, 13:03
第一次翻译文章,有很多不熟练的地方,请多指教。原文在此

雾号
THE FOG HORN
雷·布莱伯利
Ray Bradbury

在那冰冷海水中,远离陆地的地方,我们夜夜等待大雾的降临。而后雾气到来,我们便给那黄铜的机械上油,然后点亮石塔上的雾灯。如同灰霾天空中的两只鸟,麦克邓恩和我打出灯光,红光,白光,又是红光,来指引孤单的航船。如果他们看不见我们的灯光,我们还能发出声响。我们的雾号的深厚鸣响能把浓雾震成碎片,能让海鸥像一沓纸牌一样惊散,能让波浪高高翻腾,涌出白沫。

“真是孤单的生活啊。不过你已经习惯了,不是吗?”麦克邓恩问。

“是啊,”我说,“你真是个话痨,感谢上帝。”

“呃,明天就轮到你上岸了,”他笑着说,“和姑娘们跳跳舞,喝喝酒。”

“麦克邓恩,我把你一个人留在这的时候,你都在想什么?”

“我在想大海的奥秘。”麦克邓恩点燃烟斗。此时是十一月某个寒冷的夜晚,七点一刻,暖气开着,雾灯曳尾发向二百个方向,雾号在塔上高声鸣叫。远离海岸几百英里的地方都没有城镇,只有公路,孤零零地从死城延伸到海边,几乎没有车辆;还有两公里海港,也几乎没有船只。

“大海的奥秘,”麦克邓恩若有所思,“你知道吗,海洋是世界上最大的雪花。它翻滚、扩展成几千种形状和颜色,两两都不相同。多奇怪啊。某个晚上,那是几年前了,我一个人在这,海里所有的鱼全在这里浮上来了。有什么东西让它们游进了海湾,然后停在这,瑟瑟发抖地仰视着灯塔的光,看着光在它们上方变红,变白,变红,变白,我因此看见了它们奇怪的眼睛。我周身冰冷。它们像是大孔雀的尾羽,游来游去,直到午夜。然后几乎悄无声息地,它们全都走了。几百万只全都走了。我想也许在某种程度上,它们游过重洋是为了来此朝圣。多奇怪啊。不过想想灯塔在它们眼里是什么样,高出海面七十英尺,神光四射,又像怪物一样鸣叫。那些鱼,它们再也没回来,不过你不觉得它们那时以为自己目睹了上帝的降临吗?”

我打了个冷战。我看着外面的大海,它像灰色的长麻布一样,延展到无限远方的无有之地。

“哦,大海无所不包,”麦克邓恩眨着眼,紧张地抽着烟斗。他整整一天都很紧张,也没有说为什么。“对于我们的引擎和那些所谓的潜艇来说,得需要一万个世纪才能真的踏足于那片沉没的陆地,然后在那仙境一样的地方,感受到真正的恐惧。想想吧,那里还停留在史前三十万年前呢。当我们吹号行军,入侵彼此的国家,砍下彼此的脑袋的时候,它们就住在水下十二英里的又深又冷的地方,那里的历史和彗星的胡子一样老。”

“是啊,一片古老的土地。”

“跟我来,我一直有件特别的事情想告诉你。”

我们登上八十级台阶,边说边走,不紧不慢。在顶层,麦克邓恩关上房间里的灯,于是玻璃上的反光消去了。塔上的大灯嗡嗡作响,在上过油的槽里轻松转动着。雾号持续鸣响,十五秒一次。

“听起来真像个动物,不是吗?”麦克邓恩自顾自点了点头,“一个在夜间嚎叫的孤单巨兽。栖身于千万年的时光悬崖之上,呼唤着深渊:我在这,我在这,我在这啊。然后深渊给以回应,是的,它们回应了。你在这已经三个月了,乔尼,所以我最好让你做好准备。每年大约这个时候,”他说,研究着黑暗和浓雾,“都会有东西来灯塔这里。”

“就是你说的那群鱼?”

“不,这次是不一样的东西。我一直尽量拖延告诉你的时机,免得你认为我是疯子。但我只能拖到今晚了,因为如果我去年至今没标错日历,那么今晚那东西就会来。我不再具体说了,你需要自己亲眼看。就坐在这里看。如果你乐意,明天就可以卷铺盖走人,搭一艘汽船回到内陆的皮艇港口,然后开着你的车返回腹地的某个小镇,彻夜燃灯。我不会质问或者责备你。这件事至今已经发生了三年了,而这次是唯一一次有人陪我一起证实它。你就等着看吧。”

半个钟头在我们的几声低语中流逝。当我们都等得不耐烦的时候,麦克邓恩开始给我描述他的一些想法。他有关于雾号本身的若干理论。

“很久很久以前,有个人独自走在阴冷无光的海岸上,他在潮声中停步。‘我们需要一个声音来横跨洋面,去警告航船。我要做出一个。我要让那声音,像长夜中在你身畔的一张床,像你推开的门后的一间空房,像秋日里没有叶子的树木。那声音,像鸣叫着的南飞的鸟,像十一月的风,像冷硬海滩上的大洋。我要让那声音无比孤寂,以至于没人会错过它,让每个听到此声的人都在灵魂深处哭泣,向着遥远城镇里闻听此声的人哭泣。我要自己做出这样的声音和装置,人们将称它为雾号,每个听到它的人都会体悟到人生的短暂和永恒的悲哀。’”

雾号鸣叫起来。

“这个故事是我编的,”麦克邓恩轻轻地说,“试图解释为什么那东西每年都要回到灯塔这里。雾号在呼唤它,我想,于是它就来了……”

“但是——”我说。

“嘘!”麦克邓恩说,“看那儿!”他向着深渊点了点头。

有什么东西正向灯塔游来。

正如我所说,这是个凄冷的夜晚。高高的灯塔不胜寒冷,雾灯照来照去,雾号声声鸣叫,穿透层层迷雾。我看不远也看不清,但我知道深海正向着夜间的陆地流淌而来,平稳又寂静,带着湿泥的灰色。我们两人,孤单地待在灯塔之上。而后就在那里,远远的,出现一缕涟漪,然后是一层波浪,翻滚着,涌起白沫。再然后,冰冷的海面上探出一颗头,一颗巨大的头,有着深深的颜色和一双巨眼,然后是脖颈。再然后出来的——不是身体——而是越来越长的脖颈!在修长美丽的脖子上面,巨头探出水面四十英尺。直到那时身体才浮上来,仿佛小小的、覆盖着蚌壳和虾类的黑珊瑚礁,从地表之下浮现。它的尾巴轻摇了一下。从头顶到尾尖,我估计这怪兽大概有九十到一百英尺长。

我不知道我说了什么。但我的确说了点什么。

“冷静,孩子,冷静,”麦克邓恩轻声说。

“这不是真的!”我说。

“不,乔尼,我们才不是真的。这就像一千万年前一样,什么也没有改变。只有我们和这片陆地改变了,我们变得不再真实了。我们!”

它仿佛一个威严的王者,款款游动在遥远的冰水里。雾气笼罩过去,短时间地遮住它的身形。怪兽的一只眼睛发现了我们的大灯,光亮反射过来,红,白,红,白,宛若一个高处的天线,发射着原始的电码。这怪兽就像它缓缓游过的那片雾一样安静无声。

“这肯定是某种恐龙!”我蹲下来,抓住楼梯扶手。

“是的,一个种群里的一只。”

“但恐龙灭绝了!”

“不,它们只是藏进了深渊,深深的,深深的,深深的深渊。这是怎么样的一个词啊,乔尼,不是一个简单的词,它表示得太多了:‘深渊’。这个词,已经涵盖了世界上所有的寒冷、黑暗和深邃。”

“我们该怎么办?”

“该怎么办?我们有我们的本职,我们不能离开。再说了,坐再好的船回岸,也不如我们在这里呆着安全。那东西大得像个驱逐舰,也像驱逐舰一样敏捷。”

“但是这里,它为什么来这里?”

下一刻,我就得到了答案。

雾号吹响了。

怪兽回应了。

一声长啸,跨越了百万年的重洋与迷雾。那啸声无比痛苦和孤独,在我的脑海和身体中回颤。那怪兽向着灯塔吼叫。雾号吹响了。那怪兽再度吼叫。雾号吹响了。巨兽张开尖牙密布的大嘴,它发出的声音,是和雾号一样的声音。孤寂,浩然,遥远。那声音来自寥寥之地,茫茫之海,凄凄之夜,茕茕之心。就是那样的声音。

“现在,”麦克邓恩轻轻说道, “你知道它为什么要来这了?”

我点了点头。

“年复一年,乔尼,这可怜的怪兽就潜藏在千里之外的海洋,也许在二十英里深的海底,等待着,也许已经等待了一百万年,孤身一人。想想吧,一百万年,你等得了这么久吗?也许它是同类生物的最后一个。我十分确信这个猜想。总之,岸上的人建起了这座灯塔,那是五年前的事。他们安上了雾号,又把它吹响——响彻那个你安睡的、充满了海底回忆的世界,那里曾经有成千上万个你的同类,但是现在你孑然一身,全然孤单地生活在这个不属于你的世界,这个你不得不躲藏的世界。”

“但是那雾号的声音来了又去,来了又去,你在海底深渊的泥泞中翻腾,你的眼睛大大地张开,仿佛巨大的相机镜头;你动起来,慢慢地,慢慢地,因为万吨海水压在你的肩上,无比沉重。但雾号声穿透了上千英里的海水,微弱却又熟悉,你腹中的火炉燃烧起来,你向上浮动,慢慢地,慢慢地。你以鳕鱼和成群的水母充饥,在秋月里一直缓慢上浮,游过薄雾初升的九月,游过雾气渐浓、雾号呼召的十月,然后,十一月底的时候,经过许久的减压、每小时几尺的缓速,你离水面已经很近了,而且你还活着。你必须慢慢来——如果你一下子浮上来,你会爆炸。所以你用了整整三个月浮上来,又用去若干时日,穿过冷水,游向灯塔。然后你就到这里了,就在外面,在这深夜里,乔尼,这创世以来最大最大的怪兽。灯塔呼唤着你,它有和你一样探出水面的长脖子,和你一样的身体,而且最重要的,还有和你一样的声音。你现在明白了吗,乔尼, 明白了吗?”

雾号吹响了。

怪兽回应了。

我全看见了,我全明白了——百万年的独自等待,只为等到一个应该回来却再没回来的人。百万年里,被隔离在海底,承受着时间的荒谬,与此同时,天空中的翼龙一扫而光,大陆上的沼地相继干涸,树懒和剑齿虎一时风光,复又沉进沥青坑里,人类像白蚁一样奔走在群山上。

雾号吹响了。

“去年,”麦克邓恩说,“那个怪兽游了一圈又一圈,一圈又一圈,整整一宿。它不愿游近,它很困惑,或者也可能是恐惧。当然,还有一路游过来积攒的些许恼怒。但是第二天,出乎意料地,雾散了,阳光灿烂,碧空如画。那怪兽在热气和寂静中游去了,再也没回来。我猜这一年里它一直挂记着这灯塔,一直一直想着它。”

怪兽离这里只有几百码远了,它和雾号互相呼应着。灯塔的探照灯打在它的眼睛里,映出火与冰,火与冰。

“这就是生活,”麦克邓恩说,“总有人在等一个永远不会回来的人。总有人爱一个东西远胜它爱他。然后过不了太久你就想毁掉它,于是它便再也无法伤害你。”

怪兽冲向了灯塔。

雾号吹响了。

“让我们看看会发生什么,”麦克邓恩说。

他关上了雾号。

接下来的一分钟是如此的死寂,以至于我们能听见玻璃瞭望窗里的心跳声,能听见探照灯在机油里的缓慢转动声。

怪兽停住了,冻结在原地。它大灯笼一样的眼睛眨了一下。它的大嘴洞开。它低声咕隆着,好像一座火山。它左右转动着脑袋,似乎在找寻那消失在浓雾里的声音。它凝视着灯塔。它再次咕隆起来。然后它的眼睛燃起火焰。它扬起身体,拍打着水面,向着灯塔冲过来,双眼映透着怒火的折磨。

“麦克邓恩,”我大叫,“把雾号打开!”

麦克邓恩笨拙地扳动着开关。但即使他打开了开关,怪兽还是高高地直立起来。我匆匆瞥见了它巨大的爪子——鱼皮一样的网蹼在指状突起间闪闪发光——挠动着灯塔。在它那无比痛苦的面庞上,硕大的右眼在我面前闪动,仿佛一口大锅,让我几乎尖叫着陷落其中。灯塔颤动起来。雾号长鸣,巨兽长啸。它紧抓着灯塔,咬碎了瞭望窗,玻璃碎片纷纷落在我们身上。

麦克邓恩抓着我的胳膊。“快下楼!”

灯塔摇晃着,颤动着,几近崩塌。雾号和怪兽齐声呼叫。我们连滚带爬地奔下台阶。“快!”

我们刚到底下,灯塔便向我们倾塌下来。我们弓身跑下台阶,钻进小小的石室。碎石纷纷如雨,不住刮擦震颤;雾号声戛然而止。巨兽扑上灯塔。塔倒了。麦克邓恩和我跪伏在一起,紧紧握住手,在这世界崩裂之时。

一切全都结束了,四围只有黑暗,和海水拍打在石头上的声音。

还有另一个声音。

“你听,”麦克邓恩轻声说,“你听。”

我们等了一会,然后我渐渐听到了。先是巨大的抽进空气的声音,随之而来的是巨兽的哀声,迷惘和孤寂,层层叠叠扑向我们,漫过我们,它令人作呕的腥臭充斥在空气里,就在我们藏身处的一层石墙之外。它喘息着,它哭喊着。高塔不见了。灯光不见了。那跨越百万年呼唤它的声音也不见了。怪兽张开大嘴,发出震耳欲聋的声音。那是雾号的声音,一声又一声。于是在这深夜里,那些远处的航船,看不到灯光,看不到任何东西,却能听见这声音。他们一定会想:这就是了,孤寂的声音,寂寞湾的雾号。好极了。我们已经过了海岬了。

后半夜匆匆而过。

第二天下午,救援队把我们从碎石遍地的地下室里救出来。外面艳阳高照。

“它倒了,就是这样,”麦克邓恩沉痛地说,“几个巨浪拍过来,它就这样塌了。”他掐了掐我的胳膊。

没有什么特别的迹象。大海平静,天空湛蓝。只是,有一大片绿色的东西覆盖着倒塌的塔基和海岸,散发着海藻的恶臭。蝇群嗡嗡飞动。海浪把岸滩冲洗得一干二净。

第二年,他们建了新的灯塔,但那时我已经有了一个在镇里的工作,一个妻子,一间不错的暖和的小屋,在秋夜里燃着黄色的灯火,大门紧锁,烟囱冒着白烟。至于麦克邓恩,他成为了新灯塔的主人,灯塔也按他的指示,由钢筋水泥建成。“以防万一”,他说。

新的灯塔于十一月建成。我在一个傍晚独自开车过去,把车停好,遥望着灰色的海水,听着新的雾号的鸣响,每分钟一次,两次,三次,四次,孤独地传向远方。

至于那怪兽?

它再也没回来。

“它离开了,”麦克邓恩说,“它回到了深渊。它知道了不能过分地去爱任何东西。它回到了最深的深渊,再等上一百万年。啊,可怜的东西!在那等待着,等待着,目睹着人类在这可悲的星球上诞生又灭绝,等待着,等待着。”

我坐在车里,聆听着。我看不见矗立在寂寞湾的灯塔和雾灯。我只能听见雾号,雾号,雾号。它听起来像是怪兽的呼唤。

我坐在那里,希望能开口说些什么。
Comments: 7 :: View Comments
5 Pages V  1 2 3  » 

Expand

Billboard

若无特殊说明,本聚合页面内容均为T.R.O.W.会员创作编译,未经发布者允许请勿擅自转载。


Expand

Stations


Expand

Brands

360网站安全检测平台
Time is now: 2018-06-20, 11:20