diff --git a/LICENSE b/LICENSE index 2aee073e..075c24b3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Lingdong Huang +Copyright (c) 2019-present Lingdong Huang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 0b6a5d6c..92f7264f 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ # 文言 wenyan-lang +[![npm](https://img.shields.io/npm/v/@wenyanlang/core)](https://www.npmjs.com/package/@wenyanlang/core) +[![build](https://img.shields.io/github/workflow/status/LingDong-/wenyan-lang/Build%20%26%20Test)](https://github.com/LingDong-/wenyan-lang/actions) + [http://wenyan-lang.lingdong.works](http://wenyan-lang.lingdong.works) English | [简体中文](./README.zh-Hans.md) | [繁体中文](./README.zh-Hant.md) diff --git a/documentation/Compiler-API.md b/documentation/Compiler-API.md index a5de90c0..b4ae9c70 100644 --- a/documentation/Compiler-API.md +++ b/documentation/Compiler-API.md @@ -27,7 +27,7 @@ import { compile } from '@wenyanlang/core' ### Browsers -You can add following lind to the head of your html body. +You can add the following line to the head of your html body. ```html @@ -44,28 +44,53 @@ const compiled = Wenyan.compile('吾有一言。曰「「問天地好在。」 - core - [compile](#compile) + - [execute](#execute) + +### Execute + +[Source](../src/parser.js) + +```ts +function execute(source: string, options?: ExecuteOptions) +``` + +**Parameters** + +| Name | Type | Note | +| --- | --- | --- | +| source | string | The Wenyan source code | +| options | object | [Execute Options](#Execute-Options) | ### Compile [Source](../src/parser.js) ```ts -function compile(targetLang: string, source: string, options?: CompilerOptions) +function compile(source: string, options?: CompilerOptions) ``` **Parameters** | Name | Type | Note | | --- | --- | --- | -| targetLang | string | Can be `js`, `py` or `rb` | | source | string | The Wenyan source code | | options | object | [Compiler Options](#Compiler-Options) | -### Compiler Options +#### Compiler Options | Fields | Default Value | Note | | --- | --- | --- | +| lang | `js` | Target language, can be `js`, `py` or `rb` | | romanizeIdentifiers | none | Romanize variable identifiers (e.g. `甲` to `JIA2`) | | resetVarCnt | false | Reset temporary variable counter | | logCallback | console.log | Get verbose debug log | -| errorLog | process.exit | Error log | \ No newline at end of file +| errorLog | process.exit | Error log | + +#### Execute Options + +Execute Options extends all field in [Compiler Options](#Compiler-Options) + +| Fields | Default Value | Note | +| --- | --- | --- | +| outputHanzi | true | Convert numbers and bools to Hanzi | +| output | `console.log` | You can redirect the output if you don't want to use `console.log` | diff --git a/documentation/Runtime.md b/documentation/Runtime.md index 39d66d9d..12b67412 100644 --- a/documentation/Runtime.md +++ b/documentation/Runtime.md @@ -4,7 +4,7 @@ You can now run Wenyan as normal Javscript script right in your html. -[**Check out the demo**](https://jsfiddle.net/antfu/u532ny49/2/) +[**Check out the demo**](https://jsfiddle.net/antfu/u532ny49/) ## Installation @@ -47,6 +47,16 @@ You can import remote scripts as you will do for Javascript. ``` +### Outputing Hanzi + +By default, it will convert numbers and bools to hanzi. If you want to output raw numbers, you can specify `ouputHanzi="false"` in attr of script tag. + +```html + +``` + ### DOM Hacks There are some hacks you can do to access the DOM and browser APIs. This allows wenyan to do some realworld applications. diff --git a/documentation/Testing.md b/documentation/Testing.md index e7ae95f4..3ffac3f7 100644 --- a/documentation/Testing.md +++ b/documentation/Testing.md @@ -4,13 +4,7 @@ This project uses [Mocha](https://mochajs.org/) and [Chai](https://www.chaijs.com/) for unit testing and snapshot testing. -You will need to build first - -```bash -npm run build -``` - -Then you can run all the tests by +You can run all the tests by ```bash npm test diff --git a/examples/README.md b/examples/README.md index 84989196..3a09aeec 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,72 +1,44 @@ - + # Examples(範例) -| File(文檔) | Remark(說明) | -| -------------------------- | ----------------------- | -| [beer.wy][3] | while | -| [collatz.wy][4] | 角谷猜想 | -| [collatz2.wy][5] | 考拉兹猜想(角谷猜想) | -| [divination.wy][6] | 春秋古筮法 | -| [eightqueens.wy][7] | 八皇后問題 | -| [euclidean.wy][8] | 歐幾里得法 | -| [factorial.wy][9] | 階乘 | -| [fibonacci.wy][10] | 斐波那契 | -| [fibonacci2.wy][11] | 斐氏列 | -| [fizzbuzz.wy][12] | [Fizz buzz][1] | -| [hanoi.wy][13] | 漢諾塔 | -| [helloworld.wy][14] | 問天地好在 | -| [helloworld+.wy][15] | 問天地好在+ | -| [import.wy][16] | 導入 | -| [mandelbrot.wy][17] | 曼德博集 | -| [mergesort.wy][18] | 歸併排序 | -| [misc.wy][19] | 雜項 | -| [modinv.wy][20] | 大衍求一術 | -| [multiplication_table.wy][21] | 乘算口訣 | -| [nested_fun.wy][22] | 函数 | -| [obj.wy][23] | 对象 | -| [pi_leibniz.wy][24] | 萊布尼茲圓周率估算 | -| [pi_liuhui.wy][25] | 劉徽割圓術求圓周率 | -| [quicksort.wy][26] | 快速排序 | -| [quicksort_inplace.wy][27] | 快速排序2 | -| [quine.wy][28] | [自產生程式][2] | -| [quine2.wy][29] | 自產生程式2 | -| [selectionsort.wy][30] | 選擇排序 | -| [sieve.wy][31] | 埃氏篩 | -| [sqrt_newton.wy][32] | 牛頓求根法 | -| [turing.wy][33] | 圖靈機 | -| [draw_heart.wy][34] | 畫心 | +| File(文檔) | Remark(說明) | +| -------------------------------------- | ------------------------- | +| [beer.wy](beer.wy) | 九十九瓶啤酒 | +| [collatz.wy](collatz.wy) | 考拉兹猜想 | +| [collatz2.wy](collatz2.wy) | 考拉兹猜想二 | +| [divination.wy](divination.wy) | 春秋古筮法 | +| [draw_heart.wy](draw_heart.wy) | 畫心 | +| [eightqueens.wy](eightqueens.wy) | 八皇后問題 | +| [euclidean.wy](euclidean.wy) | 歐幾里得法 | +| [factorial.wy](factorial.wy) | 階乘 | +| [fibonacci.wy](fibonacci.wy) | 斐氏列 | +| [fibonacci2.wy](fibonacci2.wy) | 斐氏列二 | +| [fizzbuzz.wy](fizzbuzz.wy) | [嘶嘶嗡嗡][1] | +| [hanoi.wy](hanoi.wy) | 漢諾塔 | +| [helloworld.wy](helloworld.wy) | 問天地好在 | +| [helloworld+.wy](helloworld+.wy) | 問天地好在+ | +| [import.wy](import.wy) | 導入示例 | +| [macro.wy](macro.wy) | 宏示例 | +| [mandelbrot.wy](mandelbrot.wy) | 曼德博集 | +| [mergesort.wy](mergesort.wy) | 歸併排序 | +| [misc.wy](misc.wy) | 雜項 | +| [modinv.wy](modinv.wy) | 大衍求一術 | +| [multiplication_table.wy](multiplication_table.wy) | 乘算口訣 | +| [nested_fun.wy](nested_fun.wy) | 嵌套調用示例 | +| [obj.wy](obj.wy) | 对象示例 | +| [pi_leibniz.wy](pi_leibniz.wy) | 萊布尼茲圓周率估算 | +| [pi_liuhui.wy](pi_liuhui.wy) | 劉徽割圓術求圓周率 | +| [quicksort.wy](quicksort.wy) | 快速排序 | +| [quicksort_inplace.wy](quicksort_inplace.wy) | 快速排序二 | +| [quine.wy](quine.wy) | [自產生程式][2] | +| [quine2.wy](quine2.wy) | 自產生程式二 | +| [selectionsort.wy](selectionsort.wy) | 選擇排序 | +| [sieve.wy](sieve.wy) | 埃氏篩 | +| [sqrt_newton.wy](sqrt_newton.wy) | 牛頓求根法 | +| [tree.wy](tree.wy) | 畫樹 | +| [tree2.wy](tree2.wy) | 畫樹二 | +| [try.wy](try.wy) | 異常處理示例 | +| [turing.wy](turing.wy) | 圖靈機 | -[1]: https://en.wikipedia.org/wiki/Fizz_buzz "Fizz buzz" -[2]: https://zh.wikipedia.org/wiki/自產生程式 "自產生程式" -[3]: beer.wy -[4]: collatz.wy -[5]: collatz2.wy -[6]: divination.wy -[7]: eightqueens.wy -[8]: euclidean.wy -[9]: factorial.wy -[10]: fibonacci.wy -[11]: fibonacci2.wy -[12]: fizzbuzz.wy -[13]: hanoi.wy -[14]: helloworld.wy -[15]: helloworld+.wy -[16]: import.wy -[17]: mandelbrot.wy -[18]: mergesort.wy -[19]: misc.wy -[20]: modinv.wy -[21]: multiplication_table.wy -[22]: nested_fun.wy -[23]: obj.wy -[24]: pi_leobniz.wy -[25]: pi_liuhui.wy -[26]: quicksort.wy -[27]: quicksort_inplace.wy -[28]: quine.wy -[29]: quine2.wy -[30]: selectionsort.wy -[31]: sieve.wy -[32]: sqrt_newton.wy -[33]: turing.wy -[34]: draw_heart.wy +[1]: https://en.wikipedia.org/wiki/Fizz_buzz +[2]: https://zh.wikipedia.org/wiki/自產生程式 diff --git a/examples/draw_heart.wy b/examples/draw_heart.wy index d88b555c..addc1fbf 100644 --- a/examples/draw_heart.wy +++ b/examples/draw_heart.wy @@ -4,7 +4,7 @@ 欲行是術。必先得一言。曰「心語」。 乃行是術曰。 夫「心語」之長。名之曰「長度」。 - 吾有一言。曰「「``」」。名之曰「填充符」。 + 吾有一言。曰「「一」」。名之曰「填充符」。 吾有一言。曰「「\n」」。名之曰「换行符」。 除十三以十。名之曰「乙」。 除負十一以十。名之曰「乙止」。 @@ -25,18 +25,18 @@ 乘「甲」以「甲」。加其以「加數」。減其以一。名之曰「函數值」。 若「函數值」不大於零者。 夫「心語」之「輸出位置」。名之曰「字」。 - 銜「本行」以「字」。昔之「本行」者今其是矣。 + 加「本行」以「字」。昔之「本行」者今其是矣。 除「輸出位置」以「長度」。所餘幾何。加其以一。昔之「輸出位置」者今其是矣。 若非。 - 銜「本行」以「填充符」。昔之「本行」者今其是矣。 + 加「本行」以「填充符」。昔之「本行」者今其是矣。 终也。 加「甲」以「甲步長」。昔之「甲」者今其是矣。 云云。 減「乙」以「乙步長」。昔之「乙」者今其是矣。 - 銜「本行」以「换行符」。昔之「本行」者今其是矣。 - 銜「果」以「本行」。昔之「果」者今其是矣。 + 加「本行」以「换行符」。昔之「本行」者今其是矣。 + 加「果」以「本行」。昔之「果」者今其是矣。 云云。 吾有一言。曰「果」。書之。 是謂「畫心」之術也。 -施「畫心」於「「琉璃梳子撫青絲,畫心牽腸癡不癡。」」。 \ No newline at end of file +施「畫心」於「「琉璃梳子撫青絲。畫心牽腸癡不癡。」」。 \ No newline at end of file diff --git a/examples/obj.wy b/examples/obj.wy index 03306b35..2b9693a5 100644 --- a/examples/obj.wy +++ b/examples/obj.wy @@ -10,7 +10,7 @@ 物之「「丁」」者。數曰四。 是謂「乙」之物也。 乃得「乙」。 -是謂「造物之術」之物也。 +是謂「造物之術」之術也。 施「造物之術」於「「某甲」」。名之曰「戊」。 昔之「戊」之「「丁」」者。今五是矣。 diff --git a/examples/quine.wy b/examples/quine.wy index dc31e836..165ec8a4 100644 --- a/examples/quine.wy +++ b/examples/quine.wy @@ -1,2 +1,2 @@ 注曰Reference: 注曰https://qiita.com/amoO_O/items/5d0c4edfc99f64bea6fb -吾有一術。名之曰「自己複製」。欲行是術。必先得零數。是術曰。吾有一術。名之曰「置換」。欲行是術。必先得三數。曰「文字列」。曰「置換対象」。曰「置換先」是術曰。吾有一言。曰「「」」。名之曰「返品」。吾有一數。曰二。名之曰「未来」。吾有一爻。曰陽。名之曰「実行条件」。凡「文字列」中之「文字」。若「実行条件」者。若「文字」等於「「星」」中無陰乎「文字列」之「未来」等於「置換対象」者。昔之「文字」者。今「置換先」是。昔之「実行条件」者。今陰是。也。加「返品」以「文字」。昔之「返品」者。今其是矣。若非。昔之「実行条件」者。今陽是。也。加「未来」以一。昔之「未来」者。今其是矣。云云。乃得「返品」。是謂「置換」之術也。吾有一言。曰String.fromCharCode名之曰「函数」。施「函数」於一萬二千三百。昔之「始」者。今其是矣。施「函数」於一萬二千三百零一。昔之「終」者。今其是矣。吾有二言。曰「「吾有一術。名之曰星甲自己複製星乙。欲行是術。必先得零數。是術曰。吾有一術。名之曰星甲置換星乙。欲行是術。必先得三數。曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。吾有一數。曰二。名之曰星甲未来星乙。吾有一爻。曰陽。名之曰星甲実行条件星乙。凡星甲文字列星乙中之星甲文字星乙。若星甲実行条件星乙者。若星甲文字星乙等於星甲星甲星星乙星乙中無陰乎星甲文字列星乙之星甲未来星乙等於星甲置換対象星乙者。昔之星甲文字星乙者。今星甲置換先星乙是。昔之星甲実行条件星乙者。今陰是。也。加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。若非。昔之星甲実行条件星乙者。今陽是。也。加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。云云。乃得星甲返品星乙。是謂星甲置換星乙之術也。吾有一言。曰String.fromCharCode名之曰星甲函数星乙。施星甲函数星乙於一萬二千三百。昔之星甲始星乙者。今其是矣。施星甲函数星乙於一萬二千三百零一。昔之星甲終星乙者。今其是矣。吾有二言。曰星甲星甲星丙星乙星乙。曰星甲星甲星乙星乙。名之曰星甲原文星乙曰星甲結果星乙。施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始星乙。昔之星甲結果星乙者。今其是矣。施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終星乙。昔之星甲結果星乙者。今其是矣。施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。吾有一言。曰星甲結果星乙。書之。是謂星甲自己複製星乙之術也。施星甲自己複製星乙。」」。曰「「」」。名之曰「原文」曰「結果」。施「置換」於「原文」。於「「甲」」。於「始」。昔之「結果」者。今其是矣。施「置換」於「結果」。於「「乙」」。於「終」。昔之「結果」者。今其是矣。施「置換」於「結果」。於「「丙」」。於「原文」。昔之「結果」者。今其是矣。吾有一言。曰「結果」。書之。是謂「自己複製」之術也。施「自己複製」。 \ No newline at end of file +吾有一術。名之曰「自己複製」。欲行是術。是術曰。吾有一術。名之曰「置換」。欲行是術。必先得三數。曰「文字列」。曰「置換対象」。曰「置換先」是術曰。吾有一言。曰「「」」。名之曰「返品」。吾有一數。曰二。名之曰「未来」。吾有一爻。曰陽。名之曰「実行条件」。凡「文字列」中之「文字」。若「実行条件」者。若「文字」等於「「星」」中無陰乎「文字列」之「未来」等於「置換対象」者。昔之「文字」者。今「置換先」是。昔之「実行条件」者。今陰是。也。加「返品」以「文字」。昔之「返品」者。今其是矣。若非。昔之「実行条件」者。今陽是。也。加「未来」以一。昔之「未来」者。今其是矣。云云。乃得「返品」。是謂「置換」之術也。吾有一言。曰String.fromCharCode名之曰「函数」。施「函数」於一萬二千三百。昔之「始」者。今其是矣。施「函数」於一萬二千三百零一。昔之「終」者。今其是矣。吾有二言。曰「「吾有一術。名之曰星甲自己複製星乙。欲行是術。是術曰。吾有一術。名之曰星甲置換星乙。欲行是術。必先得三數。曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。吾有一數。曰二。名之曰星甲未来星乙。吾有一爻。曰陽。名之曰星甲実行条件星乙。凡星甲文字列星乙中之星甲文字星乙。若星甲実行条件星乙者。若星甲文字星乙等於星甲星甲星星乙星乙中無陰乎星甲文字列星乙之星甲未来星乙等於星甲置換対象星乙者。昔之星甲文字星乙者。今星甲置換先星乙是。昔之星甲実行条件星乙者。今陰是。也。加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。若非。昔之星甲実行条件星乙者。今陽是。也。加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。云云。乃得星甲返品星乙。是謂星甲置換星乙之術也。吾有一言。曰String.fromCharCode名之曰星甲函数星乙。施星甲函数星乙於一萬二千三百。昔之星甲始星乙者。今其是矣。施星甲函数星乙於一萬二千三百零一。昔之星甲終星乙者。今其是矣。吾有二言。曰星甲星甲星丙星乙星乙。曰星甲星甲星乙星乙。名之曰星甲原文星乙曰星甲結果星乙。施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始星乙。昔之星甲結果星乙者。今其是矣。施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終星乙。昔之星甲結果星乙者。今其是矣。施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。吾有一言。曰星甲結果星乙。書之。是謂星甲自己複製星乙之術也。施星甲自己複製星乙。」」。曰「「」」。名之曰「原文」曰「結果」。施「置換」於「原文」。於「「甲」」。於「始」。昔之「結果」者。今其是矣。施「置換」於「結果」。於「「乙」」。於「終」。昔之「結果」者。今其是矣。施「置換」於「結果」。於「「丙」」。於「原文」。昔之「結果」者。今其是矣。吾有一言。曰「結果」。書之。是謂「自己複製」之術也。施「自己複製」。 \ No newline at end of file diff --git a/examples/quine2.wy b/examples/quine2.wy index 09182910..326c922e 100644 --- a/examples/quine2.wy +++ b/examples/quine2.wy @@ -1,6 +1,6 @@ 注曰Reference: 注曰https://qiita.com/amoO_O/items/5d0c4edfc99f64bea6fb 吾有一術。名之曰「自己複製」。 -欲行是術。必先得零數。是術曰。 +欲行是術。是術曰。 吾有一術。名之曰「置換」。 欲行是術。必先得三數。 @@ -30,7 +30,7 @@ 施「函数」於三十二。昔之「空白」者。今其是矣。 加「空白」以「空白」。昔之「空白」者。今其是矣。 施「函数」於十。昔之「改行」者。今其是矣。 -吾有一言。曰「「吾有一術。名之曰星甲自己複製星乙。星丁欲行是術。必先得零數。是術曰。星丁星丁吾有一術。名之曰星甲置換星乙。星丁欲行是術。必先得三數。星丁曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。星丁星丙吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。星丁星丙吾有一數。曰二。名之曰星甲未来星乙。星丁星丙吾有一數。曰陽。名之曰星甲実行条件星乙。星丁星丙凡星甲文字列星乙中之星甲文字星乙。星丁星丙星丙星丙若星甲実行条件星乙者。星丁星丙星丙星丙星丙若星甲文字星乙等於星甲星甲星星乙星乙星乙中無陰乎星甲文字列星乙之未来等於星甲置換対象星乙者。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲置換先星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙星丙昔之星甲実行条件星乙者。今陰是。星丁星丙星丙星丙星丙若非。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙也。星丁星丙星丙星丙若非。星丁星丙星丙星丙星丙昔之星甲実行条件星乙者。今陽是。星丁星丙星丙星丙也。星丁星丙星丙加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。星丁星丙云云。星丁星丙乃得星甲返品星乙。星丁是謂星甲置換星乙之術也。星丁星丁吾有一言。曰String.fromCharCode名之曰星甲函数星乙。星丁施星甲函数星乙於一萬二千三百。昔之星甲始括弧星乙者。今其是矣。星丁施星甲函数星乙於一萬二千三百零一。昔之星甲終括弧星乙者。今其是矣。星丁施星甲函数星乙於三十二。昔之星甲空白星乙者。今其是矣。星丁加星甲空白星乙以星甲空白星乙。昔之星甲空白星乙者。今其是矣。星丁施星甲函数星乙於十。昔之星甲改行星乙者。今其是矣。星丁吾有一言。曰星甲星甲星戊星乙星乙。名之曰星甲原文星乙。星丁吾有一言。曰星甲星甲星乙星乙。名之曰星甲結果星乙。星丁施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲空白星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丁星乙星乙。於星甲改行星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲戊星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。星丁吾有一言。曰星甲結果星乙。書之。星丁星丁是謂星甲自己複製星乙之術也。星丁施星甲自己複製星乙。」」。名之曰「原文」。 +吾有一言。曰「「吾有一術。名之曰星甲自己複製星乙。星丁欲行是術。是術曰。星丁星丁吾有一術。名之曰星甲置換星乙。星丁欲行是術。必先得三數。星丁曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。星丁星丙吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。星丁星丙吾有一數。曰二。名之曰星甲未来星乙。星丁星丙吾有一數。曰陽。名之曰星甲実行条件星乙。星丁星丙凡星甲文字列星乙中之星甲文字星乙。星丁星丙星丙星丙若星甲実行条件星乙者。星丁星丙星丙星丙星丙若星甲文字星乙等於星甲星甲星星乙星乙星乙中無陰乎星甲文字列星乙之未来等於星甲置換対象星乙者。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲置換先星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙星丙昔之星甲実行条件星乙者。今陰是。星丁星丙星丙星丙星丙若非。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙也。星丁星丙星丙星丙若非。星丁星丙星丙星丙星丙昔之星甲実行条件星乙者。今陽是。星丁星丙星丙星丙也。星丁星丙星丙加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。星丁星丙云云。星丁星丙乃得星甲返品星乙。星丁是謂星甲置換星乙之術也。星丁星丁吾有一言。曰String.fromCharCode名之曰星甲函数星乙。星丁施星甲函数星乙於一萬二千三百。昔之星甲始括弧星乙者。今其是矣。星丁施星甲函数星乙於一萬二千三百零一。昔之星甲終括弧星乙者。今其是矣。星丁施星甲函数星乙於三十二。昔之星甲空白星乙者。今其是矣。星丁加星甲空白星乙以星甲空白星乙。昔之星甲空白星乙者。今其是矣。星丁施星甲函数星乙於十。昔之星甲改行星乙者。今其是矣。星丁吾有一言。曰星甲星甲星戊星乙星乙。名之曰星甲原文星乙。星丁吾有一言。曰星甲星甲星乙星乙。名之曰星甲結果星乙。星丁施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲空白星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丁星乙星乙。於星甲改行星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲戊星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。星丁吾有一言。曰星甲結果星乙。書之。星丁星丁是謂星甲自己複製星乙之術也。星丁施星甲自己複製星乙。」」。名之曰「原文」。 吾有一言。曰「「」」。名之曰「結果」。 施「置換」於「原文」。於「「甲」」。於「始括弧」。昔之「結果」者。今其是矣。 施「置換」於「結果」。於「「乙」」。於「終括弧」。昔之「結果」者。今其是矣。 diff --git "a/lib/\347\256\227\347\266\223.wy" "b/lib/\347\256\227\347\266\223.wy" index a567016d..b70be386 100644 --- "a/lib/\347\256\227\347\266\223.wy" +++ "b/lib/\347\256\227\347\266\223.wy" @@ -469,42 +469,151 @@ 云云。 是謂「析浮點數」之術也。 +除「上位冪」以四。名之曰「整除大數限」。 + +吾有一術。名之曰「取底除」。欲行是術。必先得二數曰「實」。曰「法」。是術曰。 + 施「正負」於「法」。名之曰「法符」。乘「法」以「法符」。名之曰「法值」。乘「實」以「法符」。名之曰「乙」。 + 施「正負」於「乙」。名之曰「乙符」。乘「乙」以「乙符」。名之曰「實值」。 + 除「法值」於「實值」。所餘幾何。名之曰「餘」。 + 減「餘」於「實值」。除其以「法值」。取一以施「取整」。名之曰「商」。 + 若「乙符」小於零者。若「餘」不等於零者。 + 減「商」於負一。昔之「商」者。今其是矣。 + 減「餘」於「法值」。昔之「餘」者。今其是矣。 + 云云。云云。 + 吾有一物。名之曰「商餘」。其物如是。 + 物之「「商」」者。數曰「商」。 + 物之「「餘」」者。數曰「餘」。 + 是謂「商餘」之物也。 + 乃得「商餘」。 +是謂「取底除」之術也。 + +吾有一術。名之曰「取整除」。欲行是術。必先得二數曰「實」。曰「法」。是術曰。 + 施「正負」於「法」。名之曰「法符」。乘「法」以「法符」。名之曰「法值」。 + 施「正負」於「實」。名之曰「實符」。乘「實」以「實符」。名之曰「實值」。 + 乘「法符」於「實符」名之曰「符」。 + 除「法值」於「實值」。所餘幾何。名之曰「餘」。 + 減「餘」於「實值」。除其以「法值」。取一以施「取整」。名之曰「商」。 + 除「法值」以二。若「餘」不小於其者。 + 加「商」以一。昔之「商」者。今其是矣。 + 減「餘」以「法值」。昔之「餘」者。今其是矣。 + 云云。 + 乘「商」以「符」。昔之「商」者。今其是矣。 + 乘「餘」以「符」。昔之「餘」者。今其是矣。 + 吾有一物。名之曰「商餘」。其物如是。 + 物之「「商」」者。數曰「商」。 + 物之「「餘」」者。數曰「餘」。 + 是謂「商餘」之物也。 + 乃得「商餘」。 +是謂「取整除」之術也。 + +吾有一列。名之曰「半圓周率密率」。 + 施「浮點移位」於八八四二七九七一九〇〇三五五五。於負四十九。充「半圓周率密率」以其。 + 施「浮點移位」於四九六七七五七六〇〇〇二一五一一。於負一百零六。充「半圓周率密率」以其。 + +吾有一術。名之曰「分四象」。欲行是術。必先得二數曰「甲」。曰「上限」。是術曰。 + 注曰「「甲須為有限非零數。」」 + 注曰「「術尚不精。當以極密率除之。」」 + 夫「甲」。夫「半圓周率密率」之一。取二以施「取整除」。名之曰「乙」。 + 夫「乙」之「「商」」。名之曰「商」。夫「乙」之「「餘」」。名之曰「餘」。 + 注曰「「半圓周率弧度即一象。」」 + 施「絕對」於「商」。若其不小於「整除大數限」者。 + 注曰「「商甚大。或算位不足而謬之。」」 + 有數四。名之曰「移位」。 + 夫「甲」。減零以「移位」。取二以施「浮點移位」。夫「上限」。取二以施「分四象」。 + 夫其之「「角」」。夫「移位」。取二以施「浮點移位」。夫「上限」。取二以施「分四象」。乃得矣。 + 云云。 + 施「取底除」於「商」。於四。夫其之「「餘」」。名之曰「象」。 + 夫「半圓周率密率」之二。乘其以「商」。減其於「餘」。昔之「餘」者。今其是矣。 + 施「絕對」於「餘」。若其大於「上限」者。 + 施「分四象」於「餘」。於「上限」。名之曰「解」。 + 夫「解」之「「象」」。加其於「象」。夫四。取二以施「取底除」。 + 夫其之「「餘」」。昔之「解」之「「象」」者。今其是矣。 + 乃得「解」。 + 若非。 + 吾有一物。名之曰「解」。其物如是。 + 物之「「角」」者。數曰「餘」。 + 物之「「象」」者。數曰「象」。 + 是謂「解」之物也。 + 乃得「解」。 + 云云。 +是謂「分四象」之術也。 + +有數七分九釐。名之曰「正餘弦角限」。注曰「「略大於四十五度。」」 + +吾有一列。名之曰「正弦多項式」。 + 除負一以六。充「正弦多項式」以其。 + 除一以一二〇。充「正弦多項式」以其。 + 除負一以五〇四〇。充「正弦多項式」以其。 + 除一以三六二八八〇。充「正弦多項式」以其。 + 除負一以三九九一六八〇〇。充「正弦多項式」以其。 + 除一以六二二七〇二〇八〇〇。充「正弦多項式」以其。 + 除負一以一三〇七六七四三六八〇〇〇。充「正弦多項式」以其。 + 除一以三五五六八七四二八〇九六〇〇〇。充「正弦多項式」以其。 + +吾有一列。名之曰「餘弦多項式」。 + 除負一以二。充「餘弦多項式」以其。 + 除一以二四。充「餘弦多項式」以其。 + 除負一以七二〇。充「餘弦多項式」以其。 + 除一以四〇三二〇。充「餘弦多項式」以其。 + 除負一以三六二八八〇〇。充「餘弦多項式」以其。 + 除一以四七九〇〇一六〇〇。充「餘弦多項式」以其。 + 除負一以八七一七八二九一二〇〇。充「餘弦多項式」以其。 + 除一以二〇九二二七八九八八八〇〇〇。充「餘弦多項式」以其。 + 注曰「「正弦。同Javascript之Math.sin也。」」 今有一術。名之曰「正弦」。欲行是術。必先得一數曰「甲」。乃行是術曰。 注曰「「數小甚矣。乃得其身。否則以泰勒展開求之。復以週期性得其餘。」」 - 施「絕對」於「甲」。若其小於零又一絲者。乃得「甲」也。 - 減零以「半圓周率」。名之曰「負半圓周率」。 - - 若「甲」大於「半圓周率」者。 - 減「甲」以「圓周率」。取一以施「正弦」。減其於零。乃得矣。 - 云云。 - - 若「甲」小於「負半圓周率」者。 - 加「甲」以「圓周率」。取一以施「正弦」。減其於零。乃得矣。 + 施「絕對」於「甲」。名之曰「乙」。 + 若「乙」小於「下位冪」者。 + 乃得「甲」也。 + 若「乙」小於「正餘弦角限」者。 + 乘「甲」於「甲」。名之曰「二次冪」。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。加其以一。乘其以「甲」。乃得矣。云云。 + 若「乙」不大於「至巨數」者。 + 施「分四象」於「甲」。於「正餘弦角限」。名之曰「丙」。 + 夫「丙」之「「角」」。名之曰「丁」。夫「丙」之「「象」」。名之曰「象」。 + 乘「丁」於「丁」。名之曰「二次冪」。 + 若「象」等於零者。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乘其以「丁」。乃得矣。云云。 + 若「象」等於一者。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乃得矣。云云。 + 若「象」等於二者。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乘其以「丁」。乃得矣。云云。 + 若「象」等於三者。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乃得矣。云云。 云云。 - - 乘「甲」以「甲」。名之曰「二次冪」。 - 乘「二次冪」以「甲」。名之曰「三次冪」。 - 乘「二次冪」以「三次冪」。名之曰「五次冪」。 - 乘「二次冪」以「五次冪」。名之曰「七次冪」。 - 乘「二次冪」以「七次冪」。名之曰「九次冪」。 - - 除「三次冪」以六。名之曰「項二」。 - 除「五次冪」以一百二十。名之曰「項三」。 - 除「七次冪」以五千零四十。名之曰「項四」。 - 除「九次冪」以三十六萬二千八百八十。名之曰「項五」。 - - 減「甲」以「項二」。加其以「項三」。減其以「項四」。加其以「項五」。乃得矣。 - + 施「不可算數乎」於「甲」。若其者。 + 乃得「甲」也。 + 施「不可算」。乃得矣。 是謂「正弦」之術也。 注曰「「餘弦。同Javascript之Math.cos也。」」 今有一術。名之曰「餘弦」。欲行是術。必先得一數曰「甲」。乃行是術曰。 注曰「「餘弦者。蓋正弦之變化所得。」」 - 加「甲」以「半圓周率」。取一以施「正弦」。乃得矣。 - + 施「絕對」於「甲」。名之曰「乙」。 + 若「乙」小於「下位冪」者。 + 乃得一也。 + 若「乙」小於「正餘弦角限」者。 + 乘「甲」於「甲」。名之曰「二次冪」。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其以一。乃得矣。云云。 + 若「乙」不大於「至巨數」者。 + 施「分四象」於「甲」。於「正餘弦角限」。名之曰「丙」。 + 夫「丙」之「「角」」。名之曰「丁」。夫「丙」之「「象」」。名之曰「象」。 + 乘「丁」於「丁」。名之曰「二次冪」。 + 若「象」等於零者。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乃得矣。云云。 + 若「象」等於一者。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乘其以「丁」。乃得矣。云云。 + 若「象」等於二者。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乃得矣。云云。 + 若「象」等於三者。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乘其以「丁」。乃得矣。云云。 + 云云。 + 施「不可算數乎」於「甲」。若其者。 + 乃得「甲」也。 + 施「不可算」。乃得矣。 是謂「餘弦」之術也。 注曰「「反正弦。同Javascript之Math.asin也。」」 @@ -543,39 +652,40 @@ 注曰「「正切。同Javascript之Math.tan也。」」 今有一術。名之曰「正切」。欲行是術。必先得一數曰「甲」。乃行是術曰。 - 注曰「「數小甚矣。乃得其身。居零與二十二度三十分之間者。以泰勒展開求之。其餘或以三角恆等式。或以週期性可得。」」 - - 施「絕對」於「甲」。若其小於零又一絲者。乃得「甲」也。 - - 若「甲」大於「圓周率」者。減「甲」以「圓周率」。取一以施「正切」。乃得矣。云云。 - 若「甲」小於零者。加「甲」以「圓周率」。取一以施「正切」。乃得矣。云云。 + 注曰「「數小甚矣。乃得其身。其餘或以三角恆等式。或以週期性可得。」」 - 若「甲」大於「半圓周率」者。減「圓周率」以「甲」。取一以施「正切」。減其於零。乃得矣。云云。 - - 除「半圓周率」以二。若其小於「甲」者。 - 減「半圓周率」以「甲」。取一以施「正切」。除其於一。乃得矣。 - 云云。 - - 除「半圓周率」以四。若其小於「甲」者。 - 除「甲」以二。取一以施「正切」。名之曰「半甲正切」。 - - 乘「半甲正切」以「半甲正切」。減其於一。名之曰「分母」。 - 乘「半甲正切」以二。除其以「分母」。乃得矣。 + 施「絕對」於「甲」。名之曰「乙」。 + 若「乙」小於「下位冪」者。 + 乃得「甲」也。 + 若「乙」小於「正餘弦角限」者。 + 乘「甲」於「甲」。名之曰「二次冪」。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。加其以一。乘其以「甲」。名之曰「勾」。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其以一。名之曰「股」。 + 除「勾」以「股」。乃得矣。云云。 + 若「乙」不大於「至巨數」者。 + 施「分四象」於「甲」。於「正餘弦角限」。名之曰「丙」。 + 夫「丙」之「「角」」。名之曰「丁」。夫「丙」之「「象」」。名之曰「象」。 + 乘「丁」於「丁」。名之曰「二次冪」。 + 若「象」等於零者。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乘其以「丁」。名之曰「勾」。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。名之曰「股」。 + 除「勾」以「股」。乃得矣。云云。 + 若「象」等於一者。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。名之曰「勾」。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乘其以「丁」。名之曰「股」。 + 除「勾」以「股」。乃得矣。云云。 + 若「象」等於二者。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乘其以「丁」。名之曰「勾」。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。名之曰「股」。 + 除「勾」以「股」。乃得矣。云云。 + 若「象」等於三者。 + 施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。名之曰「勾」。 + 施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乘其以「丁」。名之曰「股」。 + 除「勾」以「股」。乃得矣。云云。 云云。 - - 乘「甲」以「甲」。名之曰「二次冪」。 - 乘「二次冪」以「甲」。名之曰「三次冪」。 - 乘「二次冪」以「三次冪」。名之曰「五次冪」。 - 乘「二次冪」以「五次冪」。名之曰「七次冪」。 - 乘「二次冪」以「七次冪」。名之曰「九次冪」。 - - 除「三次冪」以三。名之曰「項二」。 - 乘「五次冪」以二。除其以十五。名之曰「項三」。 - 乘「七次冪」以十七。除其以三百十五。名之曰「項四」。 - 除「九次冪」以六十二。除其以二千八百三十五。名之曰「項五」。 - - 加「甲」以「項二」。加其以「項三」。加其以「項四」。加其以「項五」。乃得矣。 - + 施「不可算數乎」於「甲」。若其者。 + 乃得「甲」也。 + 施「不可算」。乃得矣。 是謂「正切」之術也。 注曰「「反正切。同Javascript之Math.atan也。」」 diff --git a/package.json b/package.json index 4ac9b003..550fd9c9 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "publish:ci": "node ./tools/publish.js", "release": "bump --commit --tag && git push --follow-tags", "docs:update": "node ./tools/stdlib_doc.js", + "make_examples_readme": "node ./tools/make_examples_readme.js", "make_ide": "node ./tools/make_ide.js", "make_site": "node ./tools/make_site.js", "ide:dev": "nodemon --ignore build,dist ./tools/make_ide.js", diff --git a/site/ide.html b/site/ide.html index a8d4c1ad..7787f947 100644 --- a/site/ide.html +++ b/site/ide.html @@ -12,62 +12,62 @@ - - + + + -

wenyan-lang

-
      Auto Highlight      Hide Imported Code      Romanization
EDITOR
COMPILED JAVASCRIPT
OUTPUT
+
+ + +       +Auto Highlight +       +Hide Imported Code +       +Output Hanzi +       +Romanization + +
EDITOR
COMPILED JAVASCRIPT
OUTPUT
diff --git a/tools/make_site.js b/tools/make_site.js index c5f13257..b0d5de52 100644 --- a/tools/make_site.js +++ b/tools/make_site.js @@ -25,7 +25,6 @@ function load_svg(pth) { svg = svg.replace(/(\d+)\.(\d)\d*/g, `$1.$2`); svg = svg.replace(/width=".+?"/, `width="100%"`); svg = svg.replace(/height=".+?"/, ``); - console.log(svg); return svg; } @@ -41,57 +40,40 @@ function main() { highlight([ed]); out.innerText = ""; var hasError = false; - var code = compile("js", ed.innerText, { + var code = compile(ed.innerText, { + lang: "js", romanizeIdentifiers: "none", errorCallback: function(x) { hasError = true; - log2div(i, x); + louts[i].innerText = x; } }); if (i == 0) { document.getElementById("js").innerText = "// JavaScript\n" + js_beautify(code); - var py = compile("py", ed.innerText, { + var py = compile(ed.innerText, { + lang: "py", romanizeIdentifiers: "none", errorCallback: () => 0 }); document.getElementById("py").innerText = "# Python\n" + py.split("#####\n")[1]; - var rb = compile("rb", ed.innerText, { + var rb = compile(ed.innerText, { + lang: "rb", romanizeIdentifiers: "none", errorCallback: () => 0 }); document.getElementById("rb").innerText = "# Ruby\n" + rb.split("#####\n")[1]; } - // hljs.highlightBlock(document.getElementById("js")); - if (!hasError) { - code = code.replace(/console.log\(/g, `log2div(` + i + ","); - eval(code); - } - } - function log2div() { - // alert(arguments[1]) - if (arguments[1] instanceof Array && arguments.length == 2) { - var l = []; - for (var i = 0; i < arguments[1].length; i++) { - if (i != 0) { - l.push("。"); + if (!hasError) { + evalCompiled(code, { + output: (...args) => { + outs[i].innerText += args.join(" ") + "\n"; } - l.push(arguments[1][i]); - } - return log2div(arguments[0], ...l); - } - var outdiv = outs[arguments[0]]; - for (var i = 1; i < arguments.length; i++) { - if (typeof arguments[i] == "number") { - outdiv.innerText += num2hanzi(arguments[i]); - } else { - outdiv.innerText += arguments[i]; - } + }); } - outdiv.innerText += "\n"; } function loop() { diff --git a/tools/test_parser.js b/tools/test_parser.js index f4a44b57..9b2ecab0 100644 --- a/tools/test_parser.js +++ b/tools/test_parser.js @@ -14,7 +14,7 @@ function readOtherExample(x) { function runExample(lang, name) { var txt = fs.readFileSync("../examples/" + name + ".wy").toString(); var sourceCode = parser.compile(lang, txt, { - romanizeIdentifiers: true, + romanizeIdentifiers: "none", //true, lib: utils.loadlib(), reader: readOtherExample }); @@ -36,17 +36,21 @@ function runExample(lang, name) { } } -function runAll(lang) { +function runAll(lang, skips = []) { var files = fs.readdirSync("../examples/").filter(x => x.endsWith(".wy")); console.log(files); for (var i = 0; i < files.length; i++) { + if (skips.includes(files[i].split(".")[0])) { + console.log("SKIPPED"); + continue; + } console.log(`======= Progress ${i + 1}/${files.length} =======`); runExample(lang, files[i].split(".")[0]); } } -runExample("js", "tree"); -// runAll("js"); +// runExample("js", "tree"); +runAll("py", ["quine", "quine2", "tree", "tree2", "try"]); // runExample("js", "../../../Downloads/local_test"); -// runExample("js", "import"); +// runExample("py", "draw_heart"); diff --git a/tools/utils.js b/tools/utils.js index 56939f07..6773102b 100644 --- a/tools/utils.js +++ b/tools/utils.js @@ -1,4 +1,5 @@ const fs = require("fs"); +const path = require("path"); var execSync = require("child_process").execSync; const catsrcIgnore = "/* wenyan-catsrc-ignore */"; @@ -33,14 +34,15 @@ function catsrc() { return s; } -function loadlib(pth = "../lib/") { +function loadlib(libDir = path.resolve(__dirname, "../lib/")) { var lib = {}; - var srcs = fs.readdirSync(pth); + var srcs = fs.readdirSync(libDir); for (var i = 0; i < srcs.length; i++) { + const subPath = path.join(libDir, srcs[i]); if (srcs[i].endsWith(".wy")) { - lib[srcs[i].split(".")[0]] = fs.readFileSync(pth + srcs[i]).toString(); - } else if (fs.lstatSync(pth + srcs[i]).isDirectory()) { - lib[srcs[i]] = loadlib((path = pth + srcs[i] + "/")); + lib[srcs[i].split(".")[0]] = fs.readFileSync(subPath).toString(); + } else if (fs.lstatSync(subPath).isDirectory()) { + lib[srcs[i]] = loadlib(subPath); } } return lib;