🌁

【wenyan-lang / 文言】Pixiで始め‘られ’る文言

に公開

仮想文言環境

算えるに二年も前、ここZennに記事の投稿を始めたのでありましたが、その記事の内容と言うは当時既に話題性も薄れ居った「文言」抔と称する言語に関するerror handlingの法を態々しく口語にて述べるなるものにして、一体全体誰ぞ瀏覽せられたる、閲覧回数を見ると55回とあるのであります。

當の記事
投稿日現在の数値

当の記事はこちら

文言という言語に実用性などないことは言わずもがな、使い勝手も聊か好からぬものですから、敢えて使わんとするような代物ではございません。本記事は寧ろ、Pixiが能の手広さを検覈するようなものになりましょう。

Node.jsの入手

何を隠そう、私がNode.jsを初めて使うきっかけとなったのが外ならぬ文言でありました。私にとってNode.jsは文言に引っ付いてきた得体のしれないものでありましたから、爾後もまともに利用したことがありません。

然う謂いますのも、文言はNode.jsで以て入手する言語であるのです。

Pixiによる方法

Node.jsは何やらご丁寧に様々な方法を用意しています。二年前の私が理解できるとは到底思えない情報量です。

Download Nodejs

件のPixiを使う時は斯様に三行で命じて済むのですから、何と時代は変わるものでしょうか。

pixi init wenyan-prj
cd wenyan-prj
pixi add nodejs

文言の入手

Node.jsを導入したことで付いてきたnpmによって、文言を入手しましょう。

pixi run npm install -g @wenyan/cli
> pixi run wenyan

 ,_ ,_
 \/ ==
 /\ []

WENYAN LANG 文言 Compiler v0.3.4

Usage: wenyan [options] [files...]

Options:
  -v, --version        Output the version
  -l, --lang <lang>    Target language, can be "js", "py" or "rb" (default: "js")
  -c, --compile        Output the compiled code instead of executing it
  -e, --eval <code>    Evaluate script
  -i, --interactive    Interactive REPL
  -o, --output [file]  Output compiled code or executing result to file
  -r, --render         Outputs renderings
  --roman [method]     Romanize identifiers. The method can be "pinyin", "baxter" or "unicode"
  --strict             Enable static typechecking (default: false)
  --allowHttp          Allow to import from http (default: false)
  --dir <path>         Directory to importing from, seprates with comma(,)
  --no-outputHanzi     Don't convert output to hanzi
  --log <file>         Save log to file
  --title <title>      Override title in rendering
  -h, --help           Display help

手に入れたところで用がないという人の大多数でしょうが、動作するところを見て終えましょう。

用例

REPL
pixi run wenyan -i
> 吾有一列名之曰「高」充「高」以「「一」」以「「二」」以「「三」」
> 夫「高」書之
一。二。三

手打ちで都度命令することも、尺紙一つ用意して一挙に命ずることもできると雖も、特に珍しいものではございません。

婦女必読家事要訓.wy
吾有一列名之曰「育児の事」充「育児の事」
以「「欺くこと勿𛄀」」
以「「脋か𛁏こと勿𛄀」」
以「「復讎𛄜教ふること勿𛄀」」
以「「無用の恐懼を教ふること勿𛄀」」
以「「嫉妬の𫝹を起さ𛁈むること勿𛄀」」
以「「妄󠄁語を語ること勿𛄀」」
以「「為𛁏勿𛄀の語を常用𛁏ること勿𛄀」」
以「「動物𛂌仁愛を施𛁏ことを教ふべ𛁅」」
以「「言行を一𛂌𛁏べ𛁅」」
以「「親愛𛁏べ𛁅」」

吾有一言曰「「婦女必読家事要訓」」書之
吾有一言曰「「第十章育児の事」」書之
夫「育児の事」書之

pixi run wenyan .\婦女必読家事要訓.wy
婦女必読家事要訓
第十章育児の事
欺くこと勿𛄀。脋か𛁏こと勿𛄀。復讎𛄜教ふること勿𛄀。無用の恐懼を教ふること勿𛄀。嫉妬の𫝹を起さ𛁈むること勿𛄀。妄󠄁語を語ること勿𛄀。為𛁏勿𛄀の語を常用𛁏ること勿𛄀。動物𛂌仁愛を施𛁏ことを教ふべ𛁅。言行を一𛂌𛁏べ𛁅。親愛𛁏べ𛁅

引用:

https://dl.ndl.go.jp/pid/848257/1/25

ところで、文言は他の言語に書き換えることもできます。JavaScriptを主として、PythonRubyに対応するとあります。

  -l, --lang <lang>    Target language, can be "js", "py" or "rb" (default: "js")
  -c, --compile        Output the compiled code instead of executing it

Pythonに変換すると斯様、今となっては古さの拭えぬ感がある書かれ方となります。

pixi run wenyan .\婦女必読家事要訓.wy -c -l py
# -*- coding: utf-8 -*-
class Ctnr:
  def __init__(self):self.dict = dict();self.length = 0;self.it = -1;
  def push(self,*args):
    for arg in args:
      self.dict[str(self.length)]=arg; self.length+=1
  def __getitem__(self,i):
    try: return self.dict[str(i)]
    except: return None
  def __setitem__(self,i,x):
    self.dict[str(i)]=x
    inti = None
    try:
      inti = int(i)
      if (abs(inti - float(i))>0.0001): inti=None
    except: pass
    if (inti != None):
      self.length=inti+1
      for j in range(0,self.length):
        try:  self.dict[str(j)]
        except: self.dict[str(j)]=None
  def slice(self,i):
    ret = Ctnr();
    for i in range(i,self.length): ret.push(self[i])
    return ret
  def concat(self,other):
    ret = Ctnr();
    for i in range(0,self.length): ret.push(self[i])
    for i in range(0,other.length): ret.push(other[i])
    return ret
  def __str__(self):
    if (len(self.dict.keys())==self.length):
      ret = "["
      for k in range(0,self.length):
        v = self[k]
        if (isinstance(v,Ctnr)): ret += v.__str__()
        else: ret += str(v)
        ret+=","
      ret += "]"
      return ret;
    else:
      ret = "{"
      for k in self.dict.keys():
        ret += str(k)+":"
        v = self.dict[k]
        if (isinstance(v,Ctnr)): ret += v.__str__()
        else: ret += str(v)
        ret+=","
      ret += "}"
      return ret;
  def __repr__(self):
    return self.__str__()
  def __iter__(self):
    self.it = -1;
    return self
  def __next__(self):
    self.it += 1
    if (self.it >= self.length): raise StopIteration()
    return self[self.it]
globals()['Ctnr']=Ctnr;
class JSON:
  @staticmethod
  def stringify(x):
    return x;
#####
育児の事=Ctnr()
育児の事.push("欺くこと勿𛄀","脋か𛁏こと勿𛄀","復讎𛄜教ふること勿𛄀","無用の恐懼を教ふること勿𛄀","嫉妬の𫝹を起さ𛁈むること勿𛄀","妄󠄁語を語ること勿𛄀","為𛁏勿𛄀の語を常用𛁏ること勿𛄀","動物𛂌仁愛を施𛁏ことを教ふべ𛁅","言行を一𛂌𛁏べ𛁅","親愛𛁏べ𛁅")
_ans1="婦女必読家事要訓"
print(_ans1);
_ans2="第十章育児の事"
print(_ans2);
_ans3=育児の事;
print(_ans3);

満足したら次の一行で片付けられます。

remove wenyan and nodejs
pixi clean

文言がPythonに書き換えるということは、Mojoで動かせるということになります。大層莫迦莫迦しいので気が向いたらば試すでしょう。

Discussion