美文网首页
MetaFun 05:山海经

MetaFun 05:山海经

作者: 明夷 | 来源:发表于2021-05-16 06:44 被阅读0次

南山经之首曰鹊山。又东三百里,曰堂庭之山。又东三百八十里,曰猨翼之山。

……

山海经的地理,真伪已难以考证,但是蜗牛世界里的静物觉得,这是一本为一些叫做山或海的静物而写的爬行指南。

出生地

鹊山,堂庭之山,猨翼之山,皆可由原点出生:

def 山 = picture enddef;

山 鹊山, 堂庭之山, 猨翼之山;
鹊山 := 框文("鹊山");
堂庭之山 := 框文("堂庭之山");
猨翼之山 := 框文("猨翼之山");

for i = 鹊山, 堂庭之山, 猨翼之山:
  draw i;
endfor;

结果只能看到猨翼之山,其他两山皆在它身后。

山的爬行

若用 MetaPost 捏造一个长度单位「里」,便可在卡片大小的空间里,让山的爬行与山海经的记录相符:

numeric 里; 里 := .125;

draw 鹊山;
draw 堂庭之山 shifted (东 300里);
draw 猨翼之山 shifted (东 680里);

结果为

问题出现了!根据山海经的记载,猨翼之山在堂庭之山的东边,二者相距 380 里,但是在上述代码里,确定猨翼之山的基准却是鹊山。

山海经里的「又」字,用得极妙,它隐含了一个相对的起点,但是又不需要特意指出这个起点。那么,在 MetaPost 代码里,能否也定义一个这样的「又」呢?

要定义又,需要一个全局变量,用它记录相对起点的绝对位置,这个变量的名字姑且叫作竖亥吧……

pair 竖亥;
竖亥 := (0, 0);

然后便可定义

vardef 又 expr a =
  竖亥 := 竖亥 shifted a;
  竖亥
enddef;

试试看,

draw 鹊山;
draw 堂庭之山 shifted 又 (东 300里);
draw 猨翼之山 shifted 又 (东 380里);

还可以定义一个

tertiarydef a 曰 b =
  b shifted a
enddef;

于是,

draw 鹊山;
draw (又 (东 300里)) 曰 堂庭之山;
draw (又 (东 380里)) 曰 猨翼之山;

首山

如果鹊山的位置并不在原点,那么竖亥的位置就需要重新定义了。竖亥的初始值应该是首山的位置,确切地说,是首山的中心点。

定义一个宏,叫 首山,用它帮助竖亥确定初始位置:

vardef 首山 expr a =
  竖亥 := center a;
  a
enddef;

MetaPost 提供的 center 宏可以确定 pathpicture 对象的中心点。

现在,可以给鹊山一个绝对的位置,

鹊山 := 鹊山 shifted (-300里, -300里);

然后,将其作为首山,山海经就可以写了,

draw 框文("出生地");
draw 首山(鹊山);
draw (又 (东 300里)) 曰 堂庭之山;
draw (又 (东 380里)) 曰 猨翼之山;

结果为

新山海经语

有了上述诸多伎俩,也许能够定义一套山海经语,用于摆放各种静物,但是何必如此崇古。语言不过是一切游戏的出生地,而语言本身就是游戏。

我可以发明一套新的山海经语言,它的样子大致如下

令 鹊山 距 原点 有 (-300里, -300里);
令 堂庭之山 距 鹊山 有 (300里, 0);
令 猨翼之山 距 堂庭之山 有 (380里, 0);

令,距,有,皆为宏,定义如下:

def 令 suffix a =
  令之体(a)
enddef;
def 令之体 (suffix a) text b =
  a := a shifted (b)
enddef;

def 距 expr a =
  (center a)
enddef;

def 有 expr b =
  shifted b
enddef;

上述宏定义所用的所有技巧里,之前未用过的仅仅是 suffix 类型的参数,它的作用是,引用一个变量。在 MetaPost 里,只有 suffix 类型的参数,能够让变量真正的出现在宏的定义里,其他类型的参数仅能让变量的副本进入宏定义。

下面是基于新山海经语定位三山的示例:

numeric 里; 里 := .125;
山 鹊山, 堂庭之山, 猨翼之山;

鹊山 := 框文("鹊山");
堂庭之山 := 框文("堂庭之山");
猨翼之山 := 框文("猨翼之山");

令 鹊山 距 (0, 0) 有 (-300里, -200里);
令 堂庭之山 距 鹊山 有 (300里, 0);
令 猨翼之山 距 堂庭之山 有 (380里, 0);

for i = 鹊山, 堂庭之山, 猨翼之山:
  draw i;
endfor;

竖亥下岗了。

结语

汉字,英文,笛卡尔坐标……混杂在一起,似乎也不难看。

相关文章

  • MetaFun 05:山海经

    南山经之首曰鹊山。又东三百里,曰堂庭之山。又东三百八十里,曰猨翼之山。 山海经的地理,真伪已难以考证,但是蜗牛世界...

  • MetaFun 09:进度

    蜗牛的身影消失在长亭外,去寻它的山和海了。我还在城里的宫廷间徘徊。 许多天后,我的小手指不再那么木然隐痛了,于是最...

  • MetaFun 06:门

    每个静物可以有很多门。蜗牛可以从一扇门进去,也可以从另一扇门出来。 有些门有名字,有些门没名字。 有名字的门,简称...

  • MetaFun 04:静物

    蜗牛生活的世界,有许多静物,其中据说有法国的餐厅。蜗牛需要爬行,这些静物同样需要。所有的静物,可以从同一个地方爬出...

  • MetaFun 01:涂鸦

    有了画布,就可以涂鸦。画布是代码,涂的也就是代码,确切地说,是 MetaPost 代码,然而更确切地说,是 Con...

  • MetaFun 03:蜗牛

    鸦在天上飞,失去了踪影。 地上有一只蜗牛,慢吞吞地爬,留下没有规律的痕迹,在阳光下略有些闪亮,闪亮里有些怀旧,在夏...

  • MetaFun 02:隐者鸦

    一幅画里的一只即将被涂的鸦,该如何完美地隐藏自己的踪迹呢? 庄子说,你知道地籁,知道人籁,但是你知道天籁吗? 隐者...

  • MetaFun 07:Lua 来了!

    蜗牛是简单的,只需要爬来爬去。静物是复杂的,即使它一生只爬一次。 框文配置 不知不觉,我已经为频频用于表示静物的框...

  • MetaFun 08:长亭外

    长亭外,古道边……现在开始回忆。 起初,在 card-env.tex 里,我定义了一个叫作 foo 的 overl...

  • 山海经西山经西次三经破解版(图文版七)补充版

    山海经西山经西次三经破解版(图文版七)补充版 大禹昆仑 0.288·字数 5014 · 阅读 2182019-05...

网友评论

      本文标题:MetaFun 05:山海经

      本文链接:https://www.haomeiwen.com/subject/rdbhjltx.html