wenyan
Jump to navigation
Jump to search
wenyan (文言) is a language created by LingDong- in 2019. The language is Turing Complete. Wenyan-lang use classical Chinese as its source code. It currently has multiple backends including JavaScript, Python, and Ruby.
Code Samples
Hello World
吾有一言。曰「「Hello World」」。書之。
綠酒千杯腸已爛
吾有一言。曰「「春日宴。」」。書之。 有數九九。名之曰「酒數」。 批曰。「「请勾选输出汉字选项。」」 恆為是。若「酒數」等於零者乃止也。 吾有三言。曰「「與君」」。曰「酒數」。 曰「「杯酒。可以窮歡宴。綠酒一杯歌一遍。」」。書之。 減「酒數」以一。昔之「酒數」者。今其是矣云云。 吾有一言。曰「「綠酒千杯腸已爛。」」。書之。
99 bottles of beer
吾有一言。曰「「春日宴。」」。書之。 有數九九。名之曰「a」。 批曰。「「请勿勾选输出汉字选项。」」 恆為是。 若「a」小於三者乃止也。 減「a」以一。 有數一。名之曰「z」。昔之「z」者。今其是矣。 吾有六言。 曰「a」。 曰「「bottles of beer on the wall,」」。 曰「a」。 曰「「bottles of beer.\nTake one down and pass it around,」」。 曰「z」。 曰「「bottles of beer on the wall.\n」」。 書之。 昔之「a」者。今「z」是矣 云云。 吾有一言。曰「「2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n1 bottle of beer on the wall, 1 bottle of beer.\nTake one down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.」」。書之。
Fibonacci sequence from 1 to 10
有數一。名之曰「代」。
有數零。名之曰「母」。
有數一。名之曰「子」。
有數零。名之曰「实」。
恆為是。若「代」大於十者乃止也。
加「母」以「子」。昔之「实」者。今其是矣。
夫「代」,夫「「代:」」,夫「实」,書之。
昔之「子」者。今「母」是矣。
昔之「母」者。今「实」是矣。
加「代」以一。昔之「代」者。今其是矣。
云云。
Mandelbrot set
吾有一術。名之曰「曼德博」。欲行是術。必先得二數。曰「寬」。曰「高」。乃行是術曰。 批曰。「「曼德博集。亦稱曼德布洛特复数集合。复平面上组成分形之点之集合也。」」 吾有一言。曰「「丁龘蠹臺龜畫龍淼蔑高五三二」」。名之曰「皴法」。 批曰。「「皴法者。圖畫之法也」」。 減零以一。名之曰「上」。加零以一。名之曰「下」。 減零以二。名之曰「左」。加零以二。名之曰「右」。 減「右」以「左」。除其以「寬」。名之曰「橫步」。 減「下」以「上」。除其以「高」。名之曰「縱步」。 有數零。名之曰「戊」。恆為是。若「戊」等於「高」者乃止也。 乘「縱步」以「戊」。加其以「上」。以名之曰「虛」。 吾有一言。名之曰「行」。 有數零。名之曰「戌」。恆為是。若「戌」等於「寬」者乃止也。 乘「橫步」以「戌」。加其以「左」。名之曰「實」。 夫「虛」。名之曰「虛虛」。 夫「實」。名之曰「實實」。 批曰。「「凡每一像素。皆算令其收斂之最大疊代數」」。 有數零。名之曰「己」。恆為是。若「己」等於十二者乃止也。 乘「實實」以「實實」。乘「虛虛」以「虛虛」。名之曰「甲」。曰「乙」。 加「甲」以「乙」。名之曰「丙」。 若「丙」大於四者乃止也。 乘「虛虛」以「實實」。乘其以二。加其以「虛」。昔之「虛虛」者。今其是矣。 減「甲」以「乙」。加其以「實」。昔之「實實」者。今其是矣。 加一以「己」。昔之「己」者。今其是矣云云。 批曰。「「既得疊代數。乃以皴法圖之」」。 減十三以「己」。名之曰「巳」。 夫「皴法」之「巳」。名之曰「墨」。 加「行」以「墨」。昔之「行」者。今其是矣。 加一以「戌」。昔之「戌」者。今其是矣云云。 吾有一言。曰「行」。書之。 加一以「戊」。昔之「戊」者。今其是矣云云。 是謂「曼德博」之術也。 批曰。「「畫曼德博集合之法。至是盡矣。乃一試之」」。 施「曼德博」於五十九。於二十四。 批曰。「「This programming language currently doesn't support standard input.」」。
Sieve of Eratosthenes
吾有一術。名之曰「埃氏篩」。欲行是術。必先得一數。曰「甲」。乃行是術曰。 吾有一列。名之曰「掩」。為是「甲」遍。充「掩」以陽也。 除「甲」以二。名之曰「甲半」。 有數二。名之曰「戊」。恆為是。若「戊」等於「甲半」者乃止也。 有數二。名之曰「戌」。恆為是。若「戌」等於「甲半」者乃止也。 乘「戊」以「戌」。名之曰「合」 若「合」不大於「甲」者。 昔之「掩」之「合」者。今陰是矣。 若非乃止也。 加一以「戌」。昔之「戌」者。今其是矣云云。 加一以「戊」。昔之「戊」者。今其是矣云云。 吾有一列。名之曰「諸素」。 昔之「戊」者。今二是矣。恆為是。若「戊」等於「掩」之長者乃止也。 夫「掩」之「戊」。名之曰「素耶」。 若「素耶」者充「諸素」以「戊」也。 加一以「戊」。昔之「戊」者。今其是矣云云。 乃得「諸素」。 是謂「埃氏篩」之術也。 施「埃氏篩」於一千。書之。
9x9 Multiplication
吾有一術名之曰「乘算口訣」。是術曰。 有數一名之曰「甲」。 恆為是。若「甲」不小於十者乃止也。 有數一名之曰「乙」。 加「甲」以「乙」名之曰「丙」。 恆為是。若「乙」不小於「丙」者乃止也。 乘「甲」以「乙」名之曰「果」。 若「果」不小於十者吾有三言。曰「乙」曰「甲」曰「果」書之。 若非吾有四言。曰「乙」曰「甲」曰「「得」」曰「果」書之也。 加「乙」以一。昔之「乙」者今其是矣。 云云。 加「甲」以一。昔之「甲」者今其是矣。 云云。 是謂「乘算口訣」之術也。 施「乘算口訣」。
Powers of 2
有數一。名之曰「z」。 有數百。名之曰「a」。 恆為是。若「a」等於零者乃止也。 減「a」以一。昔之「a」者。今其是矣。 吾有一言。曰「z」。書之。 乘「z」以二。昔之「z」者。今其是矣。 云云。
Quine (Shortest possible, I think)
吾有一術曰「String.fromCharCode」名之曰「e」吾有一言曰「「吾有一術曰!String.fromCharCode$名之曰!e$吾有一言曰!!@$$名之曰!a$施!(x=>x.replaceAll('!',e(12300)).replaceAll('$',e(12301)).replace('@',a))$於!a$書之」」名之曰「a」施「(x=>x.replaceAll('!',e(12300)).replaceAll('$',e(12301)).replace('@',a))」於「a」書之
The one given as example:
吾有一術。名之曰「自己複製」。 欲行是術。是術曰。 吾有一術。名之曰「置換」。 欲行是術。必先得三數。 曰「文字列」。曰「置換対象」。曰「置換先」是術曰。 吾有一言。曰「「」」。名之曰「返品」。 吾有一數。曰二。名之曰「未来」。 吾有一數。曰陽。名之曰「実行条件」。 凡「文字列」中之「文字」。 若「実行条件」者。 若「文字」等於「「星」」」中無陰乎「文字列」之「未来」等於「置換対象」者。 加「返品」以「置換先」。昔之「返品」者。今其是矣。 昔之「実行条件」者。今陰是。 若非。 加「返品」以「文字」。昔之「返品」者。今其是矣。 也。 若非。 昔之「実行条件」者。今陽是。 也。 加「未来」以一。昔之「未来」者。今其是矣。 云云。 乃得「返品」。 是謂「置換」之術也。 吾有一言。曰String.fromCharCode名之曰「函数」。 施「函数」於一萬二千三百。昔之「始括弧」者。今其是矣。 施「函数」於一萬二千三百零一。昔之「終括弧」者。今其是矣。 施「函数」於三十二。昔之「空白」者。今其是矣。 加「空白」以「空白」。昔之「空白」者。今其是矣。 施「函数」於十。昔之「改行」者。今其是矣。 吾有一言。曰「「吾有一術。名之曰星甲自己複製星乙。星丁欲行是術。是術曰。星丁星丁吾有一術。名之曰星甲置換星乙。星丁欲行是術。必先得三數。星丁曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。星丁星丙吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。星丁星丙吾有一數。曰二。名之曰星甲未来星乙。星丁星丙吾有一數。曰陽。名之曰星甲実行条件星乙。星丁星丙凡星甲文字列星乙中之星甲文字星乙。星丁星丙星丙星丙若星甲実行条件星乙者。星丁星丙星丙星丙星丙若星甲文字星乙等於星甲星甲星星乙星乙星乙中無陰乎星甲文字列星乙之未来等於星甲置換対象星乙者。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲置換先星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙星丙昔之星甲実行条件星乙者。今陰是。星丁星丙星丙星丙星丙若非。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙也。星丁星丙星丙星丙若非。星丁星丙星丙星丙星丙昔之星甲実行条件星乙者。今陽是。星丁星丙星丙星丙也。星丁星丙星丙加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。星丁星丙云云。星丁星丙乃得星甲返品星乙。星丁是謂星甲置換星乙之術也。星丁星丁吾有一言。曰String.fromCharCode名之曰星甲函数星乙。星丁施星甲函数星乙於一萬二千三百。昔之星甲始括弧星乙者。今其是矣。星丁施星甲函数星乙於一萬二千三百零一。昔之星甲終括弧星乙者。今其是矣。星丁施星甲函数星乙於三十二。昔之星甲空白星乙者。今其是矣。星丁加星甲空白星乙以星甲空白星乙。昔之星甲空白星乙者。今其是矣。星丁施星甲函数星乙於十。昔之星甲改行星乙者。今其是矣。星丁吾有一言。曰星甲星甲星戊星乙星乙。名之曰星甲原文星乙。星丁吾有一言。曰星甲星甲星乙星乙。名之曰星甲結果星乙。星丁施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲空白星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丁星乙星乙。於星甲改行星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲戊星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。星丁吾有一言。曰星甲結果星乙。書之。星丁星丁是謂星甲自己複製星乙之術也。星丁施星甲自己複製星乙。」」。名之曰「原文」。 吾有一言。曰「「」」。名之曰「結果」。 施「置換」於「原文」。於「「甲」」。於「始括弧」。昔之「結果」者。今其是矣。 施「置換」於「結果」。於「「乙」」。於「終括弧」。昔之「結果」者。今其是矣。 施「置換」於「結果」。於「「丙」」。於「空白」。昔之「結果」者。今其是矣。 施「置換」於「結果」。於「「丁」」。於「改行」。昔之「結果」者。今其是矣。 施「置換」於「結果」。於「「戊」」。於「原文」。昔之「結果」者。今其是矣。 吾有一言。曰「結果」。書之。 是謂「自己複製」之術也。 施「自己複製」。
Brainfuck interpreter
See here
Deadfish
吾有一術。名之曰「死魚」。欲行是術。必先得一言。曰「代碼」。 乃行是術曰。 有數零。名之曰「纍加器」。 凡「代碼」中之「字」。 若「字」等於「「i」」者。 加「纍加器」以一。昔之「纍加器」者。今其是矣。 云云。 若「字」等於「「d」」者。 減「纍加器」以一。昔之「纍加器」者。今其是矣。 云云。 若「字」等於「「s」」者。 乘「纍加器」以「纍加器」。昔之「纍加器」者。今其是矣。 云云。 若「字」等於「「o」」者。 吾有一言。曰「纍加器」。書之。 云云。 若「纍加器」等於二百五十六者。 昔之「纍加器」者。今零是矣。 云云。 若「纍加器」等於負一者。 昔之「纍加器」者。今零是矣。 云云。 云云。 是謂「死魚」之術也。 注曰「「問天地好在(數字)」」。 施「死魚」於「「iiisdsiiiiiiiioiiiiiiiiiiiiiiiiiiiiiiiiiiiiioiiiiiiiooiiiodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddoddddddddddddodddddddddddddddddddddsddoddddddddoiiioddddddoddddddddodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo」」。 吾有一言。曰「「========================」」。書之。 注曰「「XKCD隨機數」」。 施「死魚」於「「iiso」」。 吾有一言。曰「「========================」」。書之。 注曰「「必要測試」」。 施「死魚」於「「iissso」」。注曰「「零」」。 施「死魚」於「「diissisdo」」。注曰「「二百八十八」」。 施「死魚」於「「iissisdddddddddddddddddddddddddddddddddo」」。注曰「「零」」。
Error handling example
姑妄行此。 有數二十五。名之曰「Integer」。 吾有一數。曰「IntegEr」。書之。 批曰。「「此处并没有定义什么IntegEr,而是Integer,这会引发NameError错误。」」 如事不諧。豈「「虛指」」之禍歟。 吾有一言。曰「「本無此物,奈何用之?」」。書之。 豈「「文法」」之禍歟。 吾有一言。曰「「不合文法,不通之甚。」」。書之。 豈「「異類」」之禍歟。 吾有一言。曰「「物各其類。豈可混同?」」。書之。 豈「「滅頂」」之禍歟。 吾有一言。曰「「嗚呼哀哉!伏维尚飨!」」。書之。 不知何禍歟。名之曰「奇禍」。 吾有一言。曰「「人坐家中,禍從天降。」」。書之。 乃作罷。
非也。(Nope.) Interpreter
吾嘗觀「「腳本秘術」」之書。
爪哇國有腳本
var jsprompt = _ => {};
jsprompt = question => default_answer => { return prompt(question, default_answer); }
其文如是矣。
今有一術。名之曰「質問」。
欲行是術。
必先得二言。曰「言質問」。曰「言回答」。
乃行是術曰。
施「jsprompt」。於「言質問」於「言回答」。名之曰「言」。乃得「言」。
是謂「質問」之術也。
施「質問」。於「「Type:」」於「「」」。名之曰「無用者」。
吾有一言。曰「「Nope.」」。書之
Cat
吾嘗觀「「腳本秘術」」之書。
爪哇國有腳本
var jsprompt = _ => {};
jsprompt = question => default_answer => { return prompt(question, default_answer); }
其文如是矣。
今有一術。名之曰「質問」。
欲行是術。
必先得二言。曰「言質問」。曰「言回答」。
乃行是術曰。
施「jsprompt」。於「言質問」於「言回答」。名之曰「言」。乃得「言」。
是謂「質問」之術也。
施「質問」。於「「Type:」」於「「」」。名之曰「得」。
吾有一言。曰「得」。書之。
Truth-machine
吾嘗觀「「腳本秘術」」之書。
爪哇國有腳本
var jsprompt = _ => {};
jsprompt = question => default_answer => { return prompt(question, default_answer); }
其文如是矣。
吾有一數。曰零。名之曰「甲」
今有一術。名之曰「質問」。
欲行是術。
必先得二言。曰「言質問」。曰「言回答」。
乃行是術曰。
施「jsprompt」。於「言質問」於「言回答」。名之曰「言」。乃得「言」。
是謂「質問」之術也。
施「質問」於「「Type loop's time:」」於「「」」。名之曰「次」。
施「質問」於「「Type number:」」於「「」」。名之曰「答」。
若「答」等於零者。吾有一數。曰零。書之。
或若「答」等於一者。恆為是。若「甲」不等於「次」者。加「甲」以一。昔之「甲」者。今其是矣。吾有一數。曰一。書之。若非。乃止。也云云。
若非。嗚呼。「「InvalidNumber」」之禍。曰「「Number is not 1 or 0」」也
External resources
- GitHub: https://github.com/LingDong-/wenyan-lang
- Interpreter: https://www.npmjs.com/package/@wenyanlang/core
- Online IDE: https://ide.wy-lang.org/
- An explanation of this programming language in Chinese | More about this programming language
Note
Since this programming language is not perfect, it requires a certain amount of external libraries and even JavaScript scripts to assist.