Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
Posted By: Shrewd @ 2018-06-23, 13:28
从字面上看,“斯里兰卡(Sri Lanka)”似乎不如旧称“锡兰”好听,不过其中的Sri表示神圣,Lanka则是印度史诗《罗摩衍那》中十头魔王罗波那(Ravana)所居住的楞伽岛,意为“光明的土地”,所以Sri Lanka的意思是“神圣的(魔王居住的)光明之地”,相当的酷炫。

在《罗摩衍那》中,罗波那是统治斯里兰卡岛的大魔王。在经过漫长艰苦的苦行后,他向梵天祈求无敌的力量,让没有神或魔能打败他。由于祈愿是否通过的唯一审核标准是苦行是否足够,罗波那的苦行程度又已达标,所以尽管梵天知道这个祈愿后患无穷,还是只能批准了罗波那的申请。


(《罗摩衍那》中十头魔王罗波那在楞伽岛上的黄金城)

罗波那知道自己无懈可击后便开始为所欲为起来,到处倒行逆施,给三界造成巨大混乱和破坏。他甚至把坏脑筋动到了诸天神身上,不仅抢夺了人们献给诸天神的祭品,还掳走了风神伐由和火神阿耆尼。诸神苦不堪言,以因陀罗为首向梵天求助,于是梵天带领他们去见毗湿奴。毗湿奴安慰他们说,罗波那的祈愿对人或猿猴没有限定,所以可以在这方面想办法。他建议诸神转生为猿,他自己则将部分神力托生为凡间的四个王子,双方齐心协力将罗波那杀死。

此时,印度北部拘萨罗(Kosala)的国王十车王正在为无子发愁,于是精选了一匹黑色骏马做马祭向诸神求子。一年后,他的三个妻子生了四个儿子,其中罗摩(Rama)是长子,也是毗湿奴的第七个化身,体内有毗湿奴一半神性,在十车王的四个儿子中最为英俊魁梧,才智卓越,被十车王视为太子的最佳人选。

在罗摩16岁那年,他在众友仙人(Vishwamitra)的指导下一箭射死了意图破坏仙人火祭罗刹女陀吒迦 ,获得了众天神的极力赞美,并获赠天神的强力武器。之后他在仙人的带领下来到毗提诃王国,国王贾纳卡(Janaka)有一位美丽温柔的女儿,是毗湿奴的妻子吉祥天女的化身,因为出生在被犁耕耘过的田间,故名悉多(Sita,意为犁沟)。国王还有一具曾被湿婆使用的巨弓,一般人根本拉不开弓,需要很多壮汉才能把它架到车上移动。国王还对外宣称,只有能拉开巨弓的人才配得上他的女儿。


森林中的悉达与罗摩

罗摩一行人来到王宫时受到国王的热烈欢迎,当罗摩提出要参观湿婆巨弓时,国王慷慨地让人把弓运了出来。罗摩轻松地拿起弓并把它拉得满弓,他的力量是如此之大,以至弓从中断成两截。贾纳卡宣布没人比罗摩更能配得上悉多,便把公主嫁给了他。

罗摩和悉多回到拘萨罗后不久,十车王决定把王位传给他。当所有人都在为国王的这个决定欢呼时,一个阴谋却正在悄悄展开。国王的第二后吉迦伊(Kaikeyi)却在嫉恨之中,因为是首后乔萨厘雅(Kausalya)的儿子罗摩而不是她的儿子婆罗多继承王位。为了让婆罗多(Bharata)成为下一任国王,她提醒十车王:多年前,当十车王在魔鬼袭击下奄奄一息时,是她救了国王一名,国王因此承诺可以满足她的两个愿望;现在便是她兑现愿望的时候了。她提出两个要求:让她的儿子继承王位,并流放罗摩十四年。十车王大惊失色,但当年说过的话如泼出去的水,是收不回来的。于是他只能满怀内疚之前对罗摩说出此事。

罗摩得知此消息后并不责怪父王,平静地接受了自己的命运。悉多坚持和罗摩一起远赴流放之地,尽管罗摩试图说服她,但她始终坚持与丈夫同甘共苦。罗摩同父异母的弟弟罗什曼那(Lakshmanna)也坚持和他一起去。消息传出去后,举国为之震惊,十车王更是悲伤内疚不已,几天后,他就因为心痛难忍而去世了。

当婆罗多回到国内后,他为母亲吉迦伊的行为羞愧难当,因为他继承了毗湿奴的一切优良品性,不愿意为了以失去兄弟为代价换来的任何好处。于是他马上追到罗摩的流放之地,请求罗摩回来担任国王。但罗摩表示自己喜欢隐士的生活,拒绝了弟弟的请求。婆罗多只好请求哥哥给他一只草鞋,并把草鞋带回王国,放在王座上表示他只是代理罗摩治理国家。

罗摩、悉多和罗什曼那在流放之地里度过了很多年平静的生活。离誓约期还剩下半年的时候,大魔王罗波那的妹妹罗刹女首哩薄那迦(Shurpanakha,意为爪如扇子般的女人)碰巧经过森林,并看到罗摩俊美的带有蓝莲花印记的身体,便对他垂涎三尺,化身美丽的少女接近罗摩意图勾引他,还向他许诺只要他愿意跟她走,她可以让他统治一个大国。罗摩拒绝了罗刹女的勾引,表示没有什么可以让他离开悉多。首哩薄那迦转而勾引罗什曼那,但也遭到了拒绝。气恨不已的首哩薄那迦把矛头转向悉多,准备把她置于死地,但罗摩把她一把推开,罗什曼那则拉弓射箭,正好命中罗刹女的鼻子。首哩薄那迦抱头鼠窜,尖叫着逃走了。


几日后,首哩薄那迦的哥哥伽剌(Khara)带着14名罗刹前来找罗摩算账。原来首哩薄那迦吃了亏后就跑去找哥哥诉苦,让哥哥为她出口气。罗摩和罗什曼那轻松地把15名罗刹击退。伽剌很快就气势汹汹地率领一万四千名罗刹卷土重来,但罗摩和罗什曼那只花了一天时间就消灭了罗刹军并杀死了伽剌。


首哩薄那迦来到北印度产生的一系列事件引发了罗摩衍那的主要剧情

首哩薄那迦逃到另一个哥哥,也就是统治楞伽岛的十头魔王罗波那那里哭诉,并出谋划策道,报复罗摩最好的方法就是把悉多抢走。于是,罗波那的手下马力卡(Maricha)化身一只美丽的鹿出现在陪悉多在森林采野花的罗摩面前,吸引罗摩追猎鹿以便能用鹿皮取悦悉多。

罗摩追了很久,等他终于射死鹿后,马力卡马上从鹿身上逃出来,并模仿罗摩的声音大声呼喊救命。焦急的悉多于是让罗什曼那赶紧过去帮助罗摩。罗什曼那担心是魔鬼的诡计,一开始不愿意离开悉多,但呼救的哀嚎响了很久,担忧丈夫安慰的悉多乱了方寸,让罗什曼那前去看一下究竟。然而罗什曼那一离开悉多,罗波那就化身成一个仙人出现在悉多面前,对她花言巧语让她放弃罗摩,跟着罗波那去斯里兰卡当王后。悉多坚决拒绝了,表示自己除了罗摩谁也不要。罗波那于是露出狰狞的面目,一把将悉多劫持上了马车。

在罗波那劫持悉多回楞伽岛的路上,悉多一直大声呼叫罗摩和罗什曼那,附近山中的鹫王伽塔尤(Jatayu)见状飞扑过来营救。激战中,伽塔尤杀死了罗波那的骏马,击碎了魔王的马车,但最终因为实力不敌罗波那,被罗波那砍成重伤。之后罗波那继续带着悉多赶回老巢,途中路过印度南部猴王须羯哩婆(Sugriva)的领地,悉多趁魔王不注意把首饰扔到猴山上,被猴子捡走了。


罗波那杀死鹫王

此时,罗摩和罗什曼那发现悉多失踪后焦急地四处寻找,却发现鹫王奄奄一息地倒在地上。他们扶起鹫王,鹫王在艰难地挣扎说完事情始末和魔王去向就咽下最后一口气。两人强忍着悲痛地心情火葬了鹫王后朝着魔王的方向继续前行,不久后,他们遇到了另一个魔鬼,双方展开的搏斗,罗摩一刀刺中魔鬼,魔鬼挣扎倒地并口出人言,只要罗摩和罗什曼那将他火化,他就会告诉他们该如何找回悉多。罗摩兄弟一言而行,火光中魔鬼化成了一名天神,并指点他们去南印度的大山中寻找猴王须羯哩婆的领地。

兄弟俩日夜兼程地赶到了南印度山脉中猴王须羯哩婆的领地,猴王热烈地欢迎了他们,并把小猴子捡到的首饰出示给他们看。罗摩看到悉多的首饰不禁热烈盈眶又怒火中烧,但此时雨季来临不利于出行,他们不得不在猴王的领地里停留下来商议计策。

等到雨季终于结束,猴王派出了手下得力干将神猴哈奴曼前往魔王的岛屿打听消息。哈奴曼的父亲是风神伐由,因此哈奴曼神通广大,还擅长乘风飞行。他奉命飞过海洋,来到罗波那的王宫,并找到了悉多的关押处。据说就在今日斯里兰卡悉达埃里亚(Seetha Eliya)的哈克格勒山植物园(Hakgala Botanical Garden),靠近度假山城努瓦拉埃里亚。


哈奴曼在园林里发现悉多

悉多得知哈奴曼的来历和罗摩等人准备进攻楞伽岛的营救计划后,便把一枚戒指交给哈奴曼,让他带回去给罗摩,以表达自己忠贞不渝的爱。哈奴曼随后给罗波那搞了个恶作剧,他先是杀死了罗波那的许多守卫,又毁坏了很多宫楼,之后故意让罗波那捉住。罗波那为了教训这只猴子,便下令把它的尾巴上绑上浸满油脂的布片,想把哈奴曼活活烧死,不料这正中了哈奴曼之计。哈奴曼故意在罗波那的王宫里四处乱窜,点燃烧毁了宫楼无数,然后趁宫里人忙着救火之际溜之大吉了。


哈奴曼隔岸观火

此时,在海的另一头,罗摩和罗什曼那正在积极准备进军楞伽岛,他们在得到哈奴曼的消息后高兴不已,加上罗波那的兄弟维毗沙那(Vibhishana)因为看不惯兄弟的行为,也加入了罗摩和猴王的队伍,一时间罗摩方面士气大振。但有一个棘手的问题摆在他们面前,就是如何让这群不会飞的猴子渡过海峡登录楞伽岛。幸好猴子之中有一只非常能干的猴子,叫做那罗(Nala),他是工匠之神的化身,设法用石头修建起一条从印度南部通往斯里兰卡的路。之后的事情就好办了,罗摩乘在哈奴曼背上,罗什曼那乘在另一只叫安伽陀(Angada)的猴子背上,率领军队从一块石头跳到另一块石头,终于到达了罗波那的大本营前。经过一场异常激烈的战斗,罗波那的军队被罗摩的军队打败了,罗波那被罗摩亲手杀死,悉多被营救回家。罗波那的兄弟维毗沙那被罗摩任命为楞伽岛的新一任国王。

《罗摩衍那》中关于斯里兰卡的部分便是如此,虽然罗摩和悉多的故事并未结束。若按照《罗摩衍那》的说法,毗湿奴的化身罗摩征服斯里兰卡发生在公元前3000三千年前。不过斯里兰卡有文献记载的历史大约只有2000两千多年,抛开神话中的夸大成分,《罗摩衍那》中关于楞伽岛的部分有折射北印度与斯里兰卡关系的参考价值,因为夜叉族(Yakkhas)也是北印度人在古代对斯里兰卡传说中的土著部落之一的称呼;另一个土著部落被称为纳迦族(Nagas),因为他们以纳迦为图腾。传说中纳迦族和夜叉族之间冲突不断,而来自北印度的入侵者则从中渔翁得利,最终获得了斯里兰卡的统治权,这也是今日斯里兰卡的主体民族僧伽罗人的起源。

斯里兰卡最主要的四个民族包括僧伽罗人、泰米尔人、穆斯林和伯格人,其中僧伽罗人占总人口的75%左右。第一个用“僧伽罗”来音译“Sinhala”的是唐僧玄奘法师,大概是因为发音与梵语中的僧团(Sangha,音译僧伽)非常接近,而斯里兰卡又是一个负有盛名的佛教国家,所以他在《大唐西域记》里把斯里兰卡人称为僧伽罗人。

不过僧伽罗这个名字本身倒只和狮子有关,和佛教没有直接关联,“Sinha-”意为“狮-”,“-la”则是“心”或“血脉”的意思,所以中国古代也把斯里兰卡称为狮子国、狮子洲(如《梁书》称狮子国,义净《大唐西域求法高僧传》作师子国、师子洲)。至宋代时,因为古阿拉伯语称其为Sirandib,宋代赵汝适《诸蕃志》音译为“细兰”。明代马欢著《瀛涯胜览》称“锡兰”。


1686年时的地图

和其他南亚国家一样,斯里兰卡缺乏古代史资料和文献,我们今天对这个印度洋岛国古代历史的了解,主要来自公元6世纪高僧大名(Mahānāma,直译作摩诃男)根据4世纪成书的《岛史》(Dīpavamśa)编写而成的《大史》(Mahāvaṃsa)。《大史》中关于僧伽罗人起源的故事是这样的:

传说古代印度北部有一位文伽国王(Vanga,位于今之孟加拉),他与一名羯陵伽国的公主(Kalinga,位于印度奥里萨邦)联姻后,生下一位名叫索芭提毗(Suppadevi)的公主。公主一出生便被智者预言未来将嫁给一头狮子,国王因此对公主严加看守,使其不得离开宫殿半步。某晚公主趁月夜逃出王宫,在出逃路上遇到一头狮子(现代学者认为可能是指生活在丛林中的野蛮人),狮子爱上公主并把她带回洞穴,并生下一男一女。男孩叫做辛诃巴霍(Sinhabahu),意为狮力,;女孩叫做辛诃希瓦莉(Sinhasivali),意为狮美人。


还有这方面的舞台剧呢

两个孩子长大后,某日索芭提毗趁狮子外出打猎推开了被巨石封闭出口的洞穴,逃亡路上正好遇到了她的一个表兄弟,帮助公主母子带回家。公主回家后改嫁给她的表兄弟。狮子回家后发现妻女都消失后就开始逐一搜索村镇农庄,并为害乡里扰民伤人。文伽国王发布高价招募能杀死狮子的勇士,结果辛诃巴霍用利箭杀死了他的狮子父亲。辛诃巴霍回国时正值祖父去世,于是他继承了王位。但后来他把王位禅让给母亲的丈夫,回到他父亲的土地,建立了新的王国辛诃普勒(Sinhapura),娶妹妹为妻并生下16对双胞胎。

32个孩子中维杰耶王子(Vijaya)最为年长,原本作为王位继承人被父母充满厚望。可惜维杰耶生性顽劣,无恶不作,手下更有700人的随从跟着他一起为患乡里,令国人苦不堪言,多次发起大规模抗议要求国王处死维杰耶。最后国王忍无可忍,将维杰耶和他的700随从都剃去半边头发,并流放到海上。

王子沿着印度南部海岸线航行,试图寻找落脚点,但他不敢在印度的任何地方停留,因为他怕势单力薄,被当地人暴揍。最终他们找到一片貌似无人居住的地方,并在如今的马纳尔半岛普特拉姆或者尼甘布一带登陆,并将脚下的土地称为Tambaparni(在梵语中意为“铜色树叶”或“红叶树”。公元前4世纪左右古希腊学者麦加塞尼斯 (Megasthenes)将Tambaparni演化成Taprobana,后来托勒密(Claudius Ptolemaeus)在他的古代世界地图中也以此名字称呼斯里兰卡)。为了纪念自己的出身,维杰耶和他的随从们自称为狮子后裔(Sinhalese)。


印度阿旃陀石窟上所画的维杰耶王子前往斯里兰卡

很快,他们发现这片貌似无主的岛屿其实生活着很多土著,他们给其取名为夜叉族(Yakkhas)和纳迦族(Nagas)。夜叉族主要生活在岛中央的山区,这与《罗摩衍那》里关于罗刹国(Rakshasas)的描述是相当一致;而纳迦族这生活在岛的北部和西部,在凯拉尼亚(Kelaniya,(今科伦坡北部边缘凯拉尼亚Kelaniya 地区)有一位纳迦族国王。

维杰耶与夜叉族公主古维妮(Kuveni)邂逅并取得了对方的爱慕和帮助。古维妮不仅愿意嫁给维杰耶,还帮助他征服了夜叉族,后来又陆陆续续征服了其他部落,僧伽罗人发现自己成了岛屿的主宰,而岛屿本身又如此美丽富饶,于是他们决定永驻此地不再离开。

此时维杰耶的随从推举他在岛上称王,维杰耶却认为自己还没有一位合适的王后,尽管古维妮已经为他生下一对儿女,但他认为古维妮身份低下,不配成为他的王后。维杰耶于是要求随从去印度找一位门当户对看与之匹配的王室公主,最后在印度南部马杜赖(Madurai,位于印度南部泰米尔纳德邦)的潘地亚王国找到了合适的人选。潘地亚国王不仅同意女儿远嫁,还愿意陪嫁700位有贵族血统的女子当维杰耶随从的妻子。据说维杰耶的随从在印度时都是有妻子的,不过在流放时他们的妻子都到了马尔代夫,而他们征服斯里兰卡时势必也效仿他们的主子维杰耶和土著女子结合,只是这些人在他们眼中不配当妻子而已。

得知印度公主即将到来之际,维杰耶就赶走了古维妮。古维妮只要带着孩子们返回了夜叉族为数不多的城市兰卡普勒(Lankapura)。古维妮被愤怒的族人杀死了,她的一个叔叔可怜她的儿女,就让两个孩子逃走了。最流行的一种说法是他们成了今天斯里兰卡硕果仅存的土著维达人(Veddas)的祖先,还有一种说法是他们最终逃到了马来西亚(据说狮城新加坡(Singapore)原名新加普勒(Singapura))。


新加坡自称狮城

据说古维妮临终前因为极度痛恨维杰耶的无情,就诅咒维杰耶的子孙无法永远坐上王位,所以维杰耶虽然是僧伽罗王朝的开创者,在长达38年的统治期间也无痛无灾,但后来的国王确实都不是维杰耶的子孙,而是他孪生弟弟的后代。当潘地亚的公主来到兰卡之后,僧伽罗人为她和维杰耶王子举行了隆重的典礼,既是婚礼,也是维杰耶的加冕典礼。但维杰耶和潘地亚的公主没有可继承王位的子嗣,所以他写信给他的孪生弟弟请他来继承王位。

此时,他的弟弟也垂垂老矣,就派出最小的儿子去继承王位。这位王子也认为来自印度的公主才是理想的王后人选,于是更多的北印度王室成员带着亲属来到岛上,而且这些北印度王室成员大多来自佛陀所在的释迦部落。这些似乎都很好地印证了僧伽罗民族的两个主要特征:首先,他们都是来自北印度的雅利安人;其次,这个民族从起源到发展都与佛教有密切关系。
Comments: 2 :: View Comments

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: 7 :: 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
5 Pages V  1 2 3 4  » 

Expand

Billboard

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


Expand

Stations

Time is now: 2021-07-28, 18:45