Full Code of wenyan-lang/wenyan for AI

master 97f0a4b8c5a8 cached
151 files
1.2 MB
620.8k tokens
197 symbols
1 requests
Download .txt
Showing preview only (1,246K chars total). Download the full file or copy to clipboard to get everything.
Repository: wenyan-lang/wenyan
Branch: master
Commit: 97f0a4b8c5a8
Files: 151
Total size: 1.2 MB

Directory structure:
gitextract_52x0jwqd/

├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── issue.md
│   └── workflows/
│       ├── cdn.yml
│       ├── publish.yml
│       └── test.yml
├── .gitignore
├── .npmrc
├── CHANGELOG.md
├── CNAME
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── README.zh-Hans.md
├── README.zh-Hant.md
├── documentation/
│   ├── Compiler-API.md
│   ├── Importing.md
│   ├── Macros.md
│   ├── Nested-Function-Calls.md
│   ├── PREFACE.md
│   ├── Runtime.md
│   ├── Standard-Lib.md
│   ├── TODO.md
│   ├── Testing.md
│   ├── Try-Catch.md
│   └── wenyan.g4
├── examples/
│   ├── README.md
│   ├── beer.wy
│   ├── breadth_first_search.wy
│   ├── clock.wy
│   ├── collatz.wy
│   ├── collatz2.wy
│   ├── crt.wy
│   ├── divination.wy
│   ├── draw_heart.wy
│   ├── eightqueens.wy
│   ├── euclidean.wy
│   ├── factorial.wy
│   ├── fibonacci.wy
│   ├── fibonacci2.wy
│   ├── fibonacci_array.wy
│   ├── fizzbuzz.wy
│   ├── hanoi.wy
│   ├── hanoi_stack.wy
│   ├── helloworld+.wy
│   ├── helloworld.wy
│   ├── import.wy
│   ├── linglong_tower.wy
│   ├── macro.wy
│   ├── mandelbrot.wy
│   ├── mergesort.wy
│   ├── misc.wy
│   ├── modinv.wy
│   ├── multiplication_table.wy
│   ├── nested_fun.wy
│   ├── obj.wy
│   ├── pascal_triangle.wy
│   ├── pi_leibniz.wy
│   ├── pi_liuhui.wy
│   ├── quicksort.wy
│   ├── quicksort_inplace.wy
│   ├── quine.wy
│   ├── quine2.wy
│   ├── selectionsort.wy
│   ├── serialization.wy
│   ├── sieve.wy
│   ├── sqrt_newton.wy
│   ├── tree.wy
│   ├── tree2.wy
│   ├── try.wy
│   ├── turing.wy
│   └── zh_sqrt.wy
├── jest.config.js
├── lib/
│   ├── js/
│   │   ├── 位經.wy
│   │   ├── 天地經.wy
│   │   ├── 格物.wy
│   │   ├── 畫譜.wy
│   │   └── 西曆法.wy
│   ├── py/
│   │   ├── 位經.wy
│   │   ├── 天地經.wy
│   │   └── 西曆法.wy
│   ├── rb/
│   │   └── 天地經.wy
│   ├── 列經.wy
│   ├── 易經.wy
│   ├── 曆法.wy
│   ├── 曆表.wy
│   ├── 渾沌經.wy
│   ├── 算經.wy
│   └── 籌經.wy
├── netlify.toml
├── package.json
├── site/
│   ├── CNAME
│   ├── ide.html
│   └── index.html
├── src/
│   ├── browser_runtime.ts
│   ├── cli.ts
│   ├── converts/
│   │   ├── hanzi2num.ts
│   │   ├── hanzi2pinyin.ts
│   │   ├── hanzi2roman-map-baxter.json
│   │   └── hanzi2roman-map-pinyin.json
│   ├── execute.ts
│   ├── highlight.js
│   ├── keywords.ts
│   ├── macro.ts
│   ├── parser.ts
│   ├── reader.ts
│   ├── render.ts
│   ├── stdlib.ts
│   ├── transpilers/
│   │   ├── base.ts
│   │   ├── index.ts
│   │   ├── js.ts
│   │   ├── py.ts
│   │   └── rb.ts
│   ├── typecheck.ts
│   ├── types.ts
│   ├── utils.ts
│   └── version.ts
├── static/
│   ├── __migrate__.html
│   ├── _redirects
│   ├── assets/
│   │   ├── css/
│   │   │   └── site.css
│   │   └── js/
│   │       └── site.js
│   ├── index.html
│   └── spec.html
├── test/
│   ├── __snapshots__/
│   │   └── examples.test.ts.snap
│   ├── examples.test.ts
│   ├── fixture/
│   │   └── nested-import/
│   │       └── 四庫全書/
│   │           ├── 序.wy
│   │           └── 本草綱目/
│   │               ├── 序.wy
│   │               └── 草部.wy
│   ├── import.test.ts
│   ├── numbers.test.ts
│   ├── reader.test.ts
│   ├── setup.js
│   ├── stdlib.calendar.test.ts
│   ├── stdlib.math.test.cases.ts
│   ├── stdlib.math.test.ts
│   ├── stdlib.wonton.test.ts
│   └── utils.ts
├── tools/
│   ├── examples.js
│   ├── make_calendar.js
│   ├── make_examples_readme.js
│   ├── publish.js
│   ├── test_parser.ts
│   ├── utils.js
│   └── wiki/
│       ├── stdlib_cheatsheet.js
│       └── update.js
├── tsconfig.json
├── webpack.base.config.js
├── webpack.config.js
└── webpack.site.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintrc.js
================================================
module.exports = {
  parser: "@typescript-eslint/parser",
  plugins: [
    "@typescript-eslint",
    "jest",
  ],
  parserOptions: {
    sourceType: "module"
  },
  env: {
    browser: true,
    node: true,
    es6: true,
    jest: true,
  },
  extends: [
    /* disbale rules temporary, before the codebase refactored with module system */
    // "eslint:recommended",
    "prettier"
  ],
  plugins: [
    "html"
  ]
}


================================================
FILE: .gitattributes
================================================
site/* linguist-detectable=false
site linguist-detectable=false

================================================
FILE: .github/ISSUE_TEMPLATE/issue.md
================================================
---
name: Issue
about: Issue
title: ""
---

<!-- 
Please read our Contributing guide before you open the issue.

https://github.com/wenyan-lang/wenyan/wiki/Contributing

Also, please make your issue are not listed in:
https://github.com/wenyan-lang/wenyan/wiki/Feature-Requests
https://github.com/wenyan-lang/wenyan/wiki/Known-Issues

Thank you!
-->

================================================
FILE: .github/workflows/cdn.yml
================================================
name: Publish To CDN

on:
  push:
    branches: 
    - master

jobs:
  publish:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 16 ]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
          registry-url: https://registry.npmjs.org/
      - run: npm ci
      - run: npm run build:site
      - uses: antfu/gha-publish-to-git@master
        with:
          branch: cdn
          github_token: '${{ secrets.GITHUB_TOKEN  }}'
          github_pat: '${{ secrets.GH_PAT }}'
          source_folder: static/dist


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish Package

on:
  release:
    types: [created]

jobs:
  publish-npm:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 16 ]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
          registry-url: https://registry.npmjs.org/
      - run: npm ci
      - run: npm run build
      - run: npm test
      - run: npm run publish:ci
        env:
          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}


================================================
FILE: .github/workflows/test.yml
================================================
name: Build & Test

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 14, 16 ]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install
        run: npm ci
        env:
          CI: true
      - name: Lint
        run: npm run lint
      - name: Test
        run: |
          npm run build:dev
          npm test


================================================
FILE: .gitignore
================================================
.DS_Store
node_modules/
build/wenyan-linux
build/wenyan-macos
build/wenyan-win.exe
temp
dist
/tools/calendar.html
藏書樓
.node-xmlhttprequest-*
typings
tools/wiki/repo

================================================
FILE: .npmrc
================================================
scripts-prepend-node-path=true



================================================
FILE: CHANGELOG.md
================================================
# v0.3.2

## Features
- Use modern js syntax for compiled code (PR #574, thanks @tsao-chi)
- Improved error handling (#566, 8bf7e0a)

## Standard Library
- Top-level array for Wonton (d8dfb63)
- Fixes in 列經 (PR #578, thanks @wenfeng0218)

## Examples
- 玲瓏塔 (PR #578, thanks @wenfeng0218)
- 漢諾塔·堆棧法 and 斐氏列·數組法 (PR #580, thanks @wenfeng0218) 

## Misc
- The Online IDE moved to https://ide.wy-lang.org and [a separate repo](https://github.com/wenyan-lang/ide)

## Thanks
Thanks for our first financial contributor @wenfeng0218 on [Open Collective](https://opencollective.com/wenyan-lang)! 

# v0.3.1

## Standard Library
- WONTON - JSON-ish Object Serialization, #560 for details
- Math improves (PR #555, thanks @statementreply)

## Fixes
- Typescript typings (20cd77b7dac26b78033de78ae732e7bcff7338e6)

## Examples
- Chinese remainder theorem. (PR #569, thanks @YuRen-tw)

## Misc
- Improve responsive for the website (PR #568, thanks @MaoSHYJ)

# v0.3.0

## BREAKING CHANGE: `compile` API change

As we mentioned in the [v0.2.0 release](https://github.com/wenyan-lang/wenyan/releases/tag/v0.2.0), the support of using `lang` as the first argument of  `compile` is now REMOVED. Please use the new API instead.

```js
// before
compile('js', source, { ... })
// after
compile(source, { lang: 'js', ... })
```

## [New Online IDE](https://wy-lang.org/ide)
The fresh new Online IDE is now landed. With file explorer, rendering, a better editor, auto-complete, [wyg](https://github.com/wenyan-lang/wyg) support, dark mode and more. Please do check it out! (PR #515 #526 #535 #536 #537 #546 #551 #552) 

![](https://user-images.githubusercontent.com/7929704/72163213-68d0a480-3391-11ea-9196-9e21e5270149.png)
![](https://user-images.githubusercontent.com/7929704/72163214-68d0a480-3391-11ea-989f-21322555294c.png)

## We are now moved to Typescript! 

We have rewritten our codebase to Typescript. The typing declaration file is also shipped in [@wanyanlang/code](https://www.npmjs.com/package/@wenyan/core).

Check out for #543 for more details.

### Features
- Importing nested modules structure is now landed (PR #534, thanks @antfu)

### Fixes
- Functions containing elseif is miscompiled (PR #523, thanks @statementreply)

### Stdlib
- New 格物 library (PR #553, thanks @Fros1er)
- Fix atan2(Infinity, Infinity) (PR #538 , thanks @statementreply)

### Tests
- A lot of tests have been added (#527, #530, thanks @statementreply)

### Examples
- Clock (#545, thanks @antfu)
- Chinese-sqrt (增乘開平方術) (#550, thanks @jingkecn)


# v0.2.4

## import in, elseif, if true, if false, any

Thanks to everyone who contributed their ideas, a selection of proposed new syntaxes are now added

| js/c++ | wenyan | issue |
|-|-|-|
| `continue` | `乃止是遍` | #392  |
| `else if` | `或若` | #365 |
| `if (ans) {` | `若其然者` | #513 |
| `if (!ans) {` | `若其不然者` | ditto |
| `auto` | `元` | #486 |
| `require('path/to/something')` | `吾嘗觀「「某樓」」中「「某閣」」中「「某書」」之書。` | #475 |

refer to #519 for more details

# v0.2.3

## 序.wy

Think `序.wy` the Wenyan version of `index.js`.

For example, the reader now will search for a module `四庫全書` for a given path `/tmp/examples`

- `/tmp/examples/四庫全書.wy`
- `/tmp/examples/四庫全書/序.wy`

The first match will be imported. Refer to #512 for more details.

## 藏書樓

Think `藏書樓` the Wenyan version of `node_modules`.

`藏書樓` will be included as `importPaths` by CLI automatically. It will do an up searching for `藏書樓` from the cwd (just as node did)


# v0.2.2

## New Website Domain http://wy-lang.org!

We are now using Netlify to build our website & IDE. The legacy links will redirect to http://wy-lang.org automatically.

- New spec page, [check it out](https://wy-lang.org/spec)

## Features
- New option `importPaths` for specifying the import searching directories, (PR #499, by @antfu)
- New option `allowHttp` for allowing import scripts from the web (default to `false`). refer to #499 for more details.

## Fixes
- Fix for mismatched scope begin/end in typecheck (PR #496, thanks @statementreply)
- Stdlib: Fix for some 曆法 functions (PR #503, thanks @statementreply)
- Stdlib: Improve asin, acos and atan (PR #511, thanks @statementreply)

## Examples
- New example Pascal Triangle (PR #498, thanks @MerakDipper)

# v0.2.1

## Static Type Inference

When the option is turned on, the compiler will now raise exceptions if your code does not typecheck. Also it is capable of producing type signatures for inspection, e.g. ./example/quicksort.wy produces the following:

```
[0-347] {
  快排 : (('a) arr) -> (('a) arr)
  己 : (num) arr
  [33-285] {
    首 : ('a) arr
    頷 : ('a) arr
    尾 : ('a) arr
    甲一 : 'a
    甲餘 : ('a) arr
    乙 : ('a) arr
    [136-201] {
      丁 : 'a
    }
  }
}
```

For more detail, please refer to #486 

### Standard Library

- Fundamental Calendar library (PR #466, thanks @statementreply), check out [Standard Library cheatsheet](https://github.com/wenyan-lang/wenyan/blob/master/documentation/Standard-Lib.md) for more details.

### 3rd Party Compilers

- [JVM compiler](https://github.com/MagicLu550/wenyan-lang_jvm) by [MagicLu550](https://github.com/MagicLu550)

### Fixes

- Stdlib was not bundled correctly. (PR #481, thanks @antfu)


# v0.2.0

## ⚠ BREAKING CHANGE: `compile` API change
The first argument lang move to option, please switch to new API.

```js
//before
compile('js', source, { ... })
// after
compile(source, { lang: 'js', ... })
```

The old API is still functional for temporary backward compatible, the support **will be REMOVED in the next minor update.**

## Wenyan Snippets Site, #459

Please do check it out. Any feedbacks are welcome!

![](https://user-images.githubusercontent.com/7929704/71650125-049f4800-2ce2-11ea-9f44-31c9b7e626d7.png)

## New Execute API
Check out [API Document](https://github.com/wenyan-lang/wenyan/blob/master/documentation/Compiler-API.md) and #473


### Fixes
- Fix compiler crash with 0-argument macros (PR #453, thanks @statementreply)
- stdlib: Improve sin, cos and tan (^/1/3) (PR #457, thanks @statementreply)
- bool2hanzi (PR #465, thanks @Fros1er)

### Docs
- Auto generates examples for README.md (PR #448, thanks @cuixiping)


# v0.1.3

## Macros (Experimental)

As you might (not) have noticed, *wenyan-lang* strives to be more readable (for ancient Chinese people). **Macros** provide syntactic sugars to bring the 文采 of your code to the next level.

E.g. Now you can patch wenyan-lang's notorius print function like so:

```
或云「「書「甲」焉」」。
蓋謂「「吾有一言。曰「甲」。書之」」。

書「「問天地好在」」焉。
```

Since we're beating JavaScript to macros, here is a rough C equivalence:

```
#define   書(甲)焉   吾有一言。曰甲。書之
書("問天地好在")焉。
```

See [**Full Documation**](https://github.com/wenyan-lang/wenyan/blob/master/documentation/Macros.md), #440 for more details.

### Standard Library
A new standard library `畫譜` that manipulates canvas on web pages. Check out the demo on Online IDE!

### Browser Runtime
New package [`@wenyan/runtime`](https://github.com/wenyan-lang/wenyan/blob/master/documentation/Runtime.md) allowing you to run Wenyan direct in `<script>` tag of html! (PR #433, thanks @antfu)

### Docs
- [**Standard library document**](https://github.com/wenyan-lang/wenyan/blob/master/documentation/Standard-Lib.md) added. (PR #432, thanks @antfu @statementreply)

### Examples
- New example 劉徽割圓術 (PR #431, thanks @cuixiping)

### Testing
- More testing cases for hanzi2num added (PR #442, thanks @kaiyuan01)


# v0.1.2

## Overhauled `hanzi2num` (PR #413, thanks [@statementreply](https://github.com/statementreply))
- `塵埃渺漠` are now 10x each
- The character for 10^28 is changed to `穰` (U+7A70).
- `一百一` = 101 now
- Multi-character multipliers are no longer supported.
- Omitting `一` before fractional multipliers is no longer allowed. It's unclear whether `五毫絲` means 0.0051 or 5e-7, so I just disallowed it for now.
- Allow multiple multipliers: `一萬萬` = 1e+8, `一百絲` = 0.01.
- Add support for positional notation: `一三三七` = 1337
- Add digit zero `〇` (exactly one digit of zero) and decimal separator `·`: `三五〇〇·〇一` = 3500.01
- "又" can be used at more places: 三十又六 = 36

### New Features
- `『』` is now supported as string literals, an alternate of `「「」」` (5f698df434133d12b7c6027a197db634b91ace53), resolves #81 
- `、` is now supported sentence separators. (5f698df434133d12b7c6027a197db634b91ace53), resolves #15, resolves #129, resolves #348
- Platform-specific stdlib steup (1cecae9de1919486f34241f379248ed402b4fa96)
- Changelog added

### Fixes
- Nest comments (32b0f3abd1beb55cd28c369ad74b79e677248cc7) resolves #403
- Stdlib: Implement correctly rounded sqrt (4/4/4), (PR #424, thanks [@statementreply](https://github.com/statementreply))

### Examples
- New example "DrawHeart" (PR #410, thanks [@BHMulberry](https://github.com/BHMulberry))

================================================
FILE: CNAME
================================================
wenyan-lang.lingdong.works

================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
 advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
 address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
 professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at lingdong0618@hotmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Please check out the contributing guide on [wiki](https://github.com/wenyan-lang/wenyan/wiki/Contributing)

================================================
FILE: LICENSE
================================================
MIT License

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
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
all: ide cmdline
ide:
	cd tools; node make_ide.js;
cmdline:
	cd tools; node make_cmdline.js;
clean: 
	rm -f site/ide.html; rm -f build/*

================================================
FILE: README.md
================================================
<img src="screenshots/logo.png" align="right" width="128" height="128"/>

# 文言 wenyan-lang

[![npm](https://img.shields.io/npm/v/@wenyan/core)](https://www.npmjs.com/package/@wenyan/core)
[![build](https://img.shields.io/github/workflow/status/wenyan-lang/wenyan/Build%20%26%20Test)](https://github.com/wenyan-lang/wenyan/actions)
[![Netlify Status](https://api.netlify.com/api/v1/badges/c36d4838-1c8f-4cfe-986e-43e0de6f71a3/deploy-status)](https://app.netlify.com/sites/wenyan-lang/deploys)

### [wy-lang.org](https://wy-lang.org) | [Wiki](https://github.com/wenyan-lang/wenyan/wiki) | [The Book](https://github.com/wenyan-lang/book)

English | [简体中文](./README.zh-Hans.md) | [繁體中文](./README.zh-Hant.md)

文言文編程語言。A programming language for the ancient Chinese. [Try it online.](https://ide.wy-lang.org/)

![](screenshots/screenshot01.png)

[**CHANGELOG**](./CHANGELOG.md)

## 序

> 夫[唐](https://en.wikipedia.org/wiki/Emperor_Yao)、[虞](https://en.wikipedia.org/wiki/Emperor_Shun)之世,[結繩而足治](https://ctext.org/book-of-changes/xi-ci-xia/zh),屈指而足算。是時豈料百代之後,計算機械之巧,精於[公輸](https://en.wikipedia.org/wiki/Lu_Ban)之[木鳶](https://en.wikipedia.org/wiki/Lu_Ban#Inventions),善於[武侯](https://en.wikipedia.org/wiki/Zhuge_Liang)之[流馬](https://en.wikipedia.org/wiki/Wooden_ox);程式語言之多,繁若[《天官》](https://ctext.org/shiji/tian-guan-shu/zh)之星宿,奇勝[《山經》](https://en.wikipedia.org/wiki/Classic_of_Mountains_and_Seas)之走獸。[鼠](https://golang.org/)、[蟹](https://www.rust-lang.org/)、[鑽](https://www.ruby-lang.org/en/)、[魚](https://fishshell.com/),或以速稱。[蛇](https://www.python.org/)、[象](https://www.php.net/)、[駱](https://www.perl.org/)、[犀](http://shop.oreilly.com/product/9780596805531.do),各爭文采。方知[鬼之所以夜哭,天之所以雨粟](https://ctext.org/huainanzi/ben-jing-xun/zh)。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。[嗟予小子](https://zh.wikisource.org/zh-hant/%E6%A6%AE%E6%9C%A8_(%E9%99%B6%E6%B7%B5%E6%98%8E)),遂有斯志。然則數寸之烏絲猶覆於頭,[萬卷之素書未破於手](https://zh.wikisource.org/zh-hant/%E5%A5%89%E8%B4%88%E9%9F%8B%E5%B7%A6%E4%B8%9E%E4%B8%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E9%9F%BB);一身長羈於遠邦,兩耳久曠于[雅言](https://zh.wikipedia.org/wiki/%E9%9B%85%E9%9F%B3)。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故[希孟](https://en.wikipedia.org/wiki/Wang_Ximeng)不慚年少,[莊生](https://en.wikipedia.org/wiki/Zhuang_Zhou)不望[無涯](https://ctext.org/zhuangzi/nourishing-the-lord-of-life/zh)。乃作斯言。誠未能嘔瀝[長吉](https://en.wikipedia.org/wiki/Li_He)之[心血](https://zh.wikisource.org/zh-hant/%E6%9D%8E%E8%B3%80%E5%B0%8F%E5%82%B3),亦庶幾免於[義山](https://en.wikipedia.org/wiki/Li_Shangyin)之[流沫](https://zh.wikisource.org/zh-hant/%E9%9F%93%E7%A2%91)。既成之後,復學[干將鑄劍](https://zh.wikisource.org/wiki/%E9%91%84%E5%8A%8D)而自飼,[越王嚐糞](https://ctext.org/wu-yue-chun-qiu/yue-wang-gou-jian-wu-nian/zh)而當先。自謂偶追[《十書》](https://en.wikipedia.org/wiki/Ten_Computational_Canons)之筆意,但恨少[八家](https://en.wikipedia.org/wiki/Eight_Masters_of_the_Tang_and_Song)之淋漓。此[子山](https://en.wikipedia.org/wiki/Yu_Xin)所謂[士衡撫掌而甘心,平子見陋而固宜](https://zh.wikisource.org/zh-hant/%E5%93%80%E6%B1%9F%E5%8D%97%E8%B3%A6)。然則雖實[覆甕](https://zh.wikisource.org/zh-hant/%E6%99%89%E6%9B%B8/%E5%8D%B7092#%E5%B7%A6%E6%80%9D)之質,尚存斧正之望;雖乏[呂相](https://en.wikipedia.org/wiki/L%C3%BC_Buwei)之金,[易字](https://zh.wikisource.org/zh/%E5%8F%B2%E8%A8%98/%E5%8D%B7085)之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。

## Helloworld

Wenyan:

```
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
	吾有一言。曰「「問天地好在。」」。書之。
云云。
```
Equivalent JavaScript:

```JavaScript
var n = 3;
for (var i = 0; i < n; i++) {
	console.log("問天地好在。");
}
```

Output:

```
問天地好在。
問天地好在。
問天地好在。
```

Punctuations and newlines are completely optional (just like they are in Classical Chinese), so the above code is equivalent to:

```
吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云
```

More sophisticated examples, such as the Sieve of Eratosthenes, Quicksort, Mandelbrot set, and Tower of Hanoi, can be found in the `./examples` folder.

## Features
- [Natural Language Programming](https://en.wikipedia.org/wiki/Natural-language_programming) sharing the grammar of [Classical Chinese](https://en.wikipedia.org/wiki/Classical_Chinese)
- Compiles to [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript), [Python](https://python.org), or [Ruby](http://ruby-lang.org)
- [Turing complete](https://github.com/wenyan-lang/wenyan/blob/master/examples/turing.wy)
- An [Online IDE](https://ide.wy-lang.org/)
- [Examples](https://github.com/wenyan-lang/wenyan/tree/master/examples) to get started
- A packages manager [wyg(文淵閣)](https://github.com/wenyan-lang/wyg) and [awesome packages](http://wyg.wy-lang.org/) from the community.


## Try it out

### [The Online IDE](https://ide.wy-lang.org/)

![](screenshots/screenshot02.png)

### Text Editor Plugins

- [Plugin for VSCode](https://github.com/antfu/wenyan-lang-vscode) by [antfu](https://github.com/antfu)
- [Plugin for Vim](https://github.com/voldikss/vim-wenyan) by [voldikss](https://github.com/voldikss)
- [Plugin for Sublime Text](https://github.com/absop/SublimeWenyan) by [absop](https://github.com/absop)

### Command Line Compiler

Install the compiler by

```bash
npm install -g @wenyan/cli
```

Try run the included examples, e.g.:

```bash
wenyan examples/helloworld.wy
# will output: 問天地好在。
```

### [The Decompiler](https://zxch3n.github.io/wenyanizer/)

You can now translate JavaScript to wenyan-lang using the [wenyanizer](https://github.com/zxch3n/wenyanizer) by [zxch3n](https://github.com/zxch3n).

### 3rd Party Compilers

- [JVM compiler](https://github.com/MagicLu550/wenyan-lang_jvm) by [MagicLu550](https://github.com/MagicLu550)


## Documentation

Check out our [Wiki pages](https://github.com/wenyan-lang/wenyan/wiki)

- [Syntax Cheatsheet](https://github.com/wenyan-lang/wenyan/wiki/Syntax-Cheatsheet)
- [Standard Library Cheatsheet](https://github.com/wenyan-lang/wenyan/wiki/Standard-Library-Cheatsheet)
- [Library Packages](https://github.com/wenyan-lang/wenyan/wiki/Available-Packages)
- [Contributing](https://github.com/wenyan-lang/wenyan/wiki/Contributing)
- [API Specifications](https://github.com/wenyan-lang/wenyan/wiki/Compiler-API)
- [Browser Runtime](https://github.com/wenyan-lang/wenyan/wiki/Browser-Runtime)
- [Feature Requests](https://github.com/wenyan-lang/wenyan/wiki/Feature-Requests)
- [Known Issues](https://github.com/wenyan-lang/wenyan/wiki/Known-Issues)

## Contributors

### Code Contributors

This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
<a href="https://github.com/wenyan-lang/wenyan/graphs/contributors"><img src="https://opencollective.com/wenyan-lang/contributors.svg?width=890&button=false" /></a>

### Financial Contributors

Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/wenyan-lang/contribute)]

#### Individuals

<a href="https://opencollective.com/wenyan-lang"><img src="https://opencollective.com/wenyan-lang/individuals.svg?width=890"></a>

#### Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/wenyan-lang/contribute)]

<a href="https://opencollective.com/wenyan-lang/organization/0/website"><img src="https://opencollective.com/wenyan-lang/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/1/website"><img src="https://opencollective.com/wenyan-lang/organization/1/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/2/website"><img src="https://opencollective.com/wenyan-lang/organization/2/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/3/website"><img src="https://opencollective.com/wenyan-lang/organization/3/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/4/website"><img src="https://opencollective.com/wenyan-lang/organization/4/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/5/website"><img src="https://opencollective.com/wenyan-lang/organization/5/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/6/website"><img src="https://opencollective.com/wenyan-lang/organization/6/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/7/website"><img src="https://opencollective.com/wenyan-lang/organization/7/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/8/website"><img src="https://opencollective.com/wenyan-lang/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/wenyan-lang/organization/9/website"><img src="https://opencollective.com/wenyan-lang/organization/9/avatar.svg"></a>


================================================
FILE: README.zh-Hans.md
================================================
<img src="screenshots/logo.png" align="right" width="100" height="100"/>

# 文言 wenyan-lang

### [wy-lang.org](https://wy-lang.org) | [Wiki](https://github.com/wenyan-lang/wenyan/wiki)

[English](./README.md) | 简体中文 | [繁體中文](./README.zh-Hant.md)

文言文編程語言。 [在线体验](http://wenyan-lang.lingdong.works/ide.html)

> 🚧 请注意,中文版文档并非实时更新,仅供参考。如有歧义,请以英文版文档为主。

![](screenshots/screenshot01.png)

## 序

> 夫[唐](https://en.wikipedia.org/wiki/Emperor_Yao)、[虞](https://en.wikipedia.org/wiki/Emperor_Shun)之世,[結繩而足治](https://ctext.org/book-of-changes/xi-ci-xia/zh),屈指而足算。是時豈料百代之後,計算機械之巧,精於[公輸](https://en.wikipedia.org/wiki/Lu_Ban)之[木鳶](https://en.wikipedia.org/wiki/Lu_Ban#Inventions),善於[武侯](https://en.wikipedia.org/wiki/Zhuge_Liang)之[流馬](https://en.wikipedia.org/wiki/Wooden_ox);程式語言之多,繁若[《天官》](https://ctext.org/shiji/tian-guan-shu/zh)之星宿,奇勝[《山經》](https://en.wikipedia.org/wiki/Classic_of_Mountains_and_Seas)之走獸。[鼠](https://golang.org/)、[蟹](https://www.rust-lang.org/)、[鑽](http://ruby-lang.org/)、[魚](https://fishshell.com/),或以速稱。[蛇](https://www.python.org/)、[象](https://www.php.net/)、[駱](https://www.perl.org/)、[犀](http://shop.oreilly.com/product/9780596805531.do),各爭文采。方知[鬼之所以夜哭,天之所以雨粟](https://ctext.org/huainanzi/ben-jing-xun/zh)。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。[嗟予小子](https://zh.wikisource.org/zh-hant/%E6%A6%AE%E6%9C%A8_(%E9%99%B6%E6%B7%B5%E6%98%8E)),遂有斯志。然則數寸之烏絲猶覆於頭,[萬卷之素書未破於手](https://zh.wikisource.org/zh-hant/%E5%A5%89%E8%B4%88%E9%9F%8B%E5%B7%A6%E4%B8%9E%E4%B8%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E9%9F%BB);一身長羁于远邦,兩耳久旷于[雅言](https://zh.wikipedia.org/wiki/%E9%9B%85%E9%9F%B3)。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故[希孟](https://en.wikipedia.org/wiki/Wang_Ximeng)不慚年少,[莊生](https://en.wikipedia.org/wiki/Zhuang_Zhou)不望[無涯](https://ctext.org/zhuangzi/nourishing-the-lord-of-life/zh)。乃作斯言。誠未能嘔瀝[長吉](https://en.wikipedia.org/wiki/Li_He)之[心血](https://zh.wikisource.org/zh-hant/%E6%9D%8E%E8%B3%80%E5%B0%8F%E5%82%B3),亦庶幾免於[義山](https://en.wikipedia.org/wiki/Li_Shangyin)之[流沫](https://zh.wikisource.org/zh-hant/%E9%9F%93%E7%A2%91)。既成之後,復學[干將鑄劍](https://zh.wikisource.org/wiki/%E9%91%84%E5%8A%8D)而自飼,[越王嚐糞](https://ctext.org/wu-yue-chun-qiu/yue-wang-gou-jian-wu-nian/zh)而當先。自謂偶追[《十書》](https://en.wikipedia.org/wiki/Ten_Computational_Canons)之筆意,但恨少[八家](https://en.wikipedia.org/wiki/Eight_Masters_of_the_Tang_and_Song)之淋漓。此[子山](https://en.wikipedia.org/wiki/Yu_Xin)所謂[士衡抚掌而甘心,平子見陋而固宜](https://zh.wikisource.org/zh-hant/%E5%93%80%E6%B1%9F%E5%8D%97%E8%B3%A6)。然則雖實[覆甕](https://zh.wikisource.org/zh-hant/%E6%99%89%E6%9B%B8/%E5%8D%B7092#%E5%B7%A6%E6%80%9D)之質,尚存斧正之望;雖乏[呂相](https://en.wikipedia.org/wiki/L%C3%BC_Buwei)之金,[易字](https://zh.wikisource.org/zh/%E5%8F%B2%E8%A8%98/%E5%8D%B7085)之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。


## Helloworld

文言:

```
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
	吾有一言。曰「「問天地好在。」」。書之。
云云。
```
等同于以下 JavaScript:

```JavaScript
var n = 3;
for (var i = 0; i < n; i++) {
	console.log("問天地好在。");
}
```

输出:

```
問天地好在。
問天地好在。
問天地好在。
```

标点符号和换行都是可选的(就像古汉语中文字是连续的),所以上面的代码等同于:


```
吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云
```

更多复杂的例子,可以在 `./examples` 中找到。比如,埃拉托斯特尼筛法、快速排序、曼德博集合、汉诺塔。


## 特点
- 符合[古汉语](https://en.wikipedia.org/wiki/Classical_Chinese)语法的自然语言处理程序
- 可以编译成 [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript),[Python](https://python.org),或者 [Ruby](http://ruby-lang.org)
- [图灵完备](https://github.com/wenyan-lang/wenyan/blob/master/examples/turing.wy)
- [在线 IDE](http://wenyan-lang.lingdong.works/ide.html),即刻体验
- 通过[几个例子](https://github.com/wenyan-lang/wenyan/tree/master/examples)快速入门


## 安装

### 编译器

使用以下命令安装本编译器:

```bash
npm install -g @wenyan/cli
```

尝试运行内置的例子,例如:

```bash
wenyan examples/helloworld.wy -o helloworld.js
```


### [在线 IDE](http://wenyan-lang.lingdong.works/ide.html)

![](screenshots/screenshot02.png)


### 编辑器插件:

- 由[antfu](https://github.com/antfu)提供的[适用于VSCode的插件](https://github.com/antfu/wenyan-lang-vscode)
- 由[voldikss](https://github.com/voldikss)提供的[适用于Vim的插件](https://github.com/voldikss/vim-wenyan)
- 由[absop](https://github.com/absop)提供的[适用于Sublime Text的插件](https://github.com/absop/SublimeWenyan)


## 语法表

上下文无关文法的语法描述还在构建中。同时,请查阅下面的语法表,或者在 `src/parser.js` 中学习其他更多语法。当然你也可以从在线 IDE 现有的例子中学习更多语法知识!

### 变量

| wenyan | JavaScript |
|---|---|
|`吾有一數。曰三。名之曰「甲」。` | `var a = 3;` |
|`有數五十。名之曰「大衍」。` | `var dayan = 50;` |
|`昔之「甲」者。今「大衍」是也。` | `a = dayan;` |
|`吾有一言。曰「「噫吁戲」」。名之曰「乙」。` | `var b = "alas!";` |
|`吾有一爻。曰陰。名之曰「丙」。` | `var c = false;` |
|`吾有一列。名之曰「丁」。` | `var d = [];` |
|`吾有三數。曰一。曰三。曰五。名之曰「甲」曰「乙」曰「丙」。` | `var a=1,b=3,c=5;` |


### 流程控制

| wenyan | JavaScript |
|---|---|
|`若三大於二者。乃得「「想當然耳」」也。` | `if (3>2){ return "of course"; }` |
|`若三不大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。` | `if(3<=5){return "of course"}else{return "no way"}` |
|`為是百遍。⋯⋯ 云云。` | `for (var i = 0; i < 100; i++){ ... }` |
|`恆為是。⋯⋯ 云云。` | `while (true) { ... }` |
|`凡「天地」中之「人」。⋯⋯ 云云。` | `for (var human of world){ ... }` |
|`乃止。` | `break;` |


### 运算

| wenyan | JavaScript |
|---|---|
|`加一以二。` | `1+2` |
|`加一於二。` | `2+1` |
|`加一以二。乘其以三。` | `(1+2)*3` |
|`除十以三。所餘幾何。` | `10%3` |
|`減七百五十六以四百三十三。名之曰「甲」。` | `var a = 756-433;` |
|`夫「甲」「乙」中有陽乎。` | `a \|\| b` |
|`夫「甲」「乙」中無陰乎。` | `a && b` |


### 容器
数组下标从一开始。而不是零。

| wenyan | JavaScript |
|---|---|
|`吾有一列。名之曰「甲」。充「甲」以四。以二。` | `var a = []; a.push(4, 2);` |
|`銜「甲」以「乙」。以「丙」` | `a.concat(b).concat(c);` |
|`夫「甲」之一。` | `a[0]` |
|`夫「甲」之其餘。` | `a.slice(1);` |
|`夫「玫瑰」之「「名」」。` | `rose["name"]` |
|`夫「寶劍」之長。` | `sword.length;` |



### 对象

| wenyan | JavaScript |
|---|---|
|`吾有一物。名之曰「甲」。` | `var a = {};` |
|`吾有一物。名之曰「甲」。其物如是。物之「「乙」」者。數曰三。物之「「丙」」者。言曰「「丁」」。是謂「甲」之物也。` | `var a = {b:3, c:"d"}` |


### 函数

| wenyan | JavaScript |
|---|---|
|`吾有一術。名之曰「吸星大法」。是術曰。⋯⋯是謂「吸星大法」之術也。`|`function f(){...}`|
|`吾有一術。名之曰「六脈神劍」。欲行是術。必先得六數。曰「甲」。曰「乙」。曰「丙」。曰「丁」。曰「戊」。曰「己」乃行是術曰。⋯⋯是謂「六脈神劍」之術也。`|`function f(a,b,c,d,e,f){...}`|
|`吾有一術。名之曰「翻倍」。欲行是術。必先得一數。曰「甲」。乃行是術曰。乘「甲」以二。名之曰「乙」。乃得「乙」。是謂「翻倍」之術也。`|`function double(a){var b = a * 2; return b;}`|
|`施「翻倍」於「大衍」。`|`double(dayan);`|
|`吾有一術。名之曰「甲」。欲行是術。必先得一數曰「乙」。二言。曰「丙」。曰「丁」`|`function a(float b, string c, string d)`|
|`夫「甲」。夫「乙」。夫「丙」。取二以施「丁」。取二以施「戊」。名之曰「己」。` | `var f = e(a,d(b,c))`|
|`夫「甲」。夫「乙」。夫「丙」。取二以施「丁」。取二以施「戊」。取一以施「己」。夫「庚」。夫「辛」。取三以施「壬」。名之曰「癸」。` | `var j = i(f(e(a,d(b,c))),g,h)`|

### 导入

| wenyan | JavaScript |
|---|---|
|`吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」之義。` | `var {sin,cos} = require("math");` |

### 杂项

| wenyan | JavaScript |
|---|---|
|`吾有一數。曰五。書之。`|`console.log(5);`|

### 注释

| wenyan | JavaScript |
|---|---|
|`批曰。「「文氣淋灕。字句切實」」。` | `/*文氣淋灕。字句切實*/` |
|`注曰。「「文言備矣」」。` | `/*文言備矣*/` |
|`疏曰。「「居第一之位故稱初。以其陽爻故稱九」」。` | `/*居第一之位故稱初。以其陽爻故稱九*/` |


## 渲染器

```bash
wenyan examples/turing.wy --render 圖靈機 --output .
```

`src/render.js` 脚本文件能把 `wy` 代码格式化输出成为古汉语书籍样式(历史印刷书籍)的矢量图(SVG)。同时它还可以将生成的SVG文件解析回原始文言代码。需要获取更详细的信息,请使用`wenyan -h`命令来获取帮助。

下图是用 wenyan 编写的 通用图灵机程序 渲染而成。

![](screenshots/screenshot03.png)

## 功能请求

在你打开一个新Issue之前,请先检查你的需求是否属于以下类别:

|名称|优先级|需要帮助|状态|
|---|---|---|---|
|[语言规范](https://github.com/wenyan-lang/wenyan/issues/1)|  ***** | | 正在进行中 |
|[类](https://github.com/wenyan-lang/wenyan/issues/31) / [对象文法](https://github.com/wenyan-lang/wenyan/issues/20) |  *** | | 对象文法已经添加 |
|[导入语句](https://github.com/wenyan-lang/wenyan/issues/100) |  *** | | 导入语句已经添加 |
|标准库 ([Math(数学)](https://github.com/wenyan-lang/wenyan/issues/55)/[Bitwise ops(位运算)](https://github.com/wenyan-lang/wenyan/issues/2)/[Random(随机)](https://github.com/wenyan-lang/wenyan/issues/87)) |  ***** | √ | 正在进行中 |
|[测试套件](https://github.com/wenyan-lang/wenyan/issues/38)|  **** | √ | 正在进行中 |
|[Switch语句](https://github.com/wenyan-lang/wenyan/issues/53)|  *** | | |
|[函数式程序设计](https://github.com/wenyan-lang/wenyan/issues/99) |  *** | | |
|更严格的编译器 |  **** | | |
|其他语言的编译器 |  ** | √ | |
|[编辑器的插件](https://github.com/wenyan-lang/wenyan/issues/77) |  ** | √ | 适用于VSCode, Vim, Sublime的插件已添加 |
|将 [js](https://github.com/wenyan-lang/wenyan/issues/47)/[py](https://github.com/wenyan-lang/wenyan/issues/67)/[anything](https://github.com/wenyan-lang/wenyan/issues/73) 转换回 wenyan(文言) |  * | √ | |
|[转义](https://github.com/wenyan-lang/wenyan/issues/84)/[生成](https://github.com/wenyan-lang/wenyan/issues/128) 特殊符号 |  *** | | |
|[对「「」」的替换语法](https://github.com/wenyan-lang/wenyan/issues/81)|  ** | | |
|[对 。的替换语法](https://github.com/wenyan-lang/wenyan/issues/93)|  ** | | |
|在线 IDE 的 [字体](https://github.com/wenyan-lang/wenyan/issues/5) 和 [垂直文本](https://github.com/wenyan-lang/wenyan/issues/9) |  ** | | |
|[将注释呈现为小型内联文本](https://github.com/wenyan-lang/wenyan/issues/148) | ** | | |
|更多示例 | ** | √ | |

如果你可以帮助我们实现一个在`需要帮助`下有`√`的功能,请放心提交一个PR。我们将非常感谢你!如果你想帮助我们实现其他功能,也请让我们知道!谢谢。

## 已知问题
|名称|优先级|需要帮助|状态|
|---|---|---|---|
|[汉字到数字的转换问题](https://github.com/wenyan-lang/wenyan/issues/114)|  ***** | | |
|[汉字到数字转换中多字符数字没有被加入支持](https://github.com/wenyan-lang/wenyan/issues/130) |  *** | | |


================================================
FILE: README.zh-Hant.md
================================================
<img src="screenshots/logo.png" align="right" width="100" height="100"/>

# 文言 wenyan-lang

### [wy-lang.org](https://wy-lang.org) | [Wiki](https://github.com/wenyan-lang/wenyan/wiki)

[English](./README.md) | [简体中文](./README.zh-Hans.md) | 繁體中文

文言文程式語言。 [線上體驗](http://wenyan-lang.lingdong.works/ide.html)

> 🚧 請註意,中文版文件並非即時更新,僅供參考。如有歧義,請以英文版文件為主。

![](screenshots/screenshot01.png)

## 序

> 夫[唐](https://en.wikipedia.org/wiki/Emperor_Yao)、[虞](https://en.wikipedia.org/wiki/Emperor_Shun)之世,[結繩而足治](https://ctext.org/book-of-changes/xi-ci-xia/zh),屈指而足算。是時豈料百代之後,計算機械之巧,精於[公輸](https://en.wikipedia.org/wiki/Lu_Ban)之[木鳶](https://en.wikipedia.org/wiki/Lu_Ban#Inventions),善於[武侯](https://en.wikipedia.org/wiki/Zhuge_Liang)之[流馬](https://en.wikipedia.org/wiki/Wooden_ox);程式語言之多,繁若[《天官》](https://ctext.org/shiji/tian-guan-shu/zh)之星宿,奇勝[《山經》](https://en.wikipedia.org/wiki/Classic_of_Mountains_and_Seas)之走獸。[鼠](https://golang.org/)、[蟹](https://www.rust-lang.org/)、[鑽](http://ruby-lang.org/)、[魚](https://fishshell.com/),或以速稱。[蛇](https://www.python.org/)、[象](https://www.php.net/)、[駱](https://www.perl.org/)、[犀](http://shop.oreilly.com/product/9780596805531.do),各爭文采。方知[鬼之所以夜哭,天之所以雨粟](https://ctext.org/huainanzi/ben-jing-xun/zh)。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。[嗟予小子](https://zh.wikisource.org/zh-hant/%E6%A6%AE%E6%9C%A8_(%E9%99%B6%E6%B7%B5%E6%98%8E)),遂有斯志。然則數寸之烏絲猶覆於頭,[萬卷之素書未破於手](https://zh.wikisource.org/zh-hant/%E5%A5%89%E8%B4%88%E9%9F%8B%E5%B7%A6%E4%B8%9E%E4%B8%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E9%9F%BB);一身長羁于远邦,兩耳久旷于[雅言](https://zh.wikipedia.org/wiki/%E9%9B%85%E9%9F%B3)。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故[希孟](https://en.wikipedia.org/wiki/Wang_Ximeng)不慚年少,[莊生](https://en.wikipedia.org/wiki/Zhuang_Zhou)不望[無涯](https://ctext.org/zhuangzi/nourishing-the-lord-of-life/zh)。乃作斯言。誠未能嘔瀝[長吉](https://en.wikipedia.org/wiki/Li_He)之[心血](https://zh.wikisource.org/zh-hant/%E6%9D%8E%E8%B3%80%E5%B0%8F%E5%82%B3),亦庶幾免於[義山](https://en.wikipedia.org/wiki/Li_Shangyin)之[流沫](https://zh.wikisource.org/zh-hant/%E9%9F%93%E7%A2%91)。既成之後,復學[干將鑄劍](https://zh.wikisource.org/wiki/%E9%91%84%E5%8A%8D)而自飼,[越王嚐糞](https://ctext.org/wu-yue-chun-qiu/yue-wang-gou-jian-wu-nian/zh)而當先。自謂偶追[《十書》](https://en.wikipedia.org/wiki/Ten_Computational_Canons)之筆意,但恨少[八家](https://en.wikipedia.org/wiki/Eight_Masters_of_the_Tang_and_Song)之淋漓。此[子山](https://en.wikipedia.org/wiki/Yu_Xin)所謂[士衡抚掌而甘心,平子見陋而固宜](https://zh.wikisource.org/zh-hant/%E5%93%80%E6%B1%9F%E5%8D%97%E8%B3%A6)。然則雖實[覆甕](https://zh.wikisource.org/zh-hant/%E6%99%89%E6%9B%B8/%E5%8D%B7092#%E5%B7%A6%E6%80%9D)之質,尚存斧正之望;雖乏[呂相](https://en.wikipedia.org/wiki/L%C3%BC_Buwei)之金,[易字](https://zh.wikisource.org/zh/%E5%8F%B2%E8%A8%98/%E5%8D%B7085)之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。


## Helloworld

文言:

```
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
吾有一言。曰「「問天地好在。」」。書之。
云云。
```
等同於以下 JavaScript:

```JavaScript
var n = 3;
for (var i = 0; i < n; i++) {
console.log("問天地好在。");
}
```

輸出:

```
問天地好在。
問天地好在。
問天地好在。
```

標點符號和換行都是可選的(就像古漢語中文字是連續的),所以上面的程式碼等同於:


```
吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云
```

更多複雜的例子,可以在 `./examples` 中找到。比如,埃拉托斯特尼篩法、快速排序、曼德博集合、河諾塔。


## 特點
- 符合[古漢語](https://en.wikipedia.org/wiki/Classical_Chinese)語法的自然語言處理程式
- 可以編譯成[JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript),[Python](https://python.org),或者[Ruby](http://ruby-lang.org)
- [圖靈完備](https://github.com/wenyan-lang/wenyan/blob/master/examples/turing.wy)
- [線上 IDE](http://wenyan-lang.lingdong.works/ide.html),即刻體驗
- 通過[幾個例子](https://github.com/wenyan-lang/wenyan/tree/master/examples)快速入門


## 安裝

### 編譯器

使用以下命令安裝本編譯器:

```bash
npm install -g @wenyan/cli
```

嘗試運行內建的例子,例如:

```bash
wenyan examples/helloworld.wy -o helloworld.js
```


### [線上 IDE](http://wenyan-lang.lingdong.works/ide.html)

![](screenshots/screenshot02.png)


### 編輯器外掛:

- 由[antfu](https://github.com/antfu)提供的[適用於VSCode的外掛](https://github.com/antfu/wenyan-lang-vscode)
- 由[voldikss](https://github.com/voldikss)提供的[適用於Vim的外掛](https://github.com/voldikss/vim-wenyan)
- 由[absop](https://github.com/absop)提供的[適用於Sublime Text的外掛](https://github.com/absop/SublimeWenyan)


## 語法表

上下文無關文法的語法描述還在構建中。同時,請查閱下面的語法表,或者在 `src/parser.js` 中學習其他更多語法。當然你也可以從線上 IDE 現有的例子中學習更多語法知識!

### 變量

| wenyan | JavaScript |
|---|---|
|`吾有一數。曰三。名之曰「甲」。 ` | `var a = 3;` |
|`有數五十。名之曰「大衍」。 ` | `var dayan = 50;` |
|`昔之「甲」者。今「大衍」是也。 ` | `a = dayan;` |
|`吾有一言。曰「「噫吁戲」」。名之曰「乙」。 ` | `var b = "alas!";` |
|`吾有一爻。曰陰。名之曰「丙」。 ` | `var c = false;` |
|`吾有一列。名之曰「丁」。 ` | `var d = [];` |
|`吾有三數。曰一。曰三。曰五。名之曰「甲」曰「乙」曰「丙」。 ` | `var a=1,b=3,c=5;` |


### 流程控制

| wenyan | JavaScript |
|---|---|
|`若三大於二者。乃得「「想當然耳」」也。 ` | `if (3>2){ return "of course"; }` |
|`若三不大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。 ` | `if(3<=5){return "of course"}else{return "no way"}` |
|`為是百遍。 ⋯⋯ 云云。 ` | `for (var i = 0; i < 100; i++){ ... }` |
|`恆為是。 ⋯⋯ 云云。 ` | `while (true) { ... }` |
|`凡「天地」中之「人」。 ⋯⋯ 云云。 ` | `for (var human of world){ ... }` |
|`乃止。 ` | `break;` |


### 運算

| wenyan | JavaScript |
|---|---|
|`加一以二。 ` | `1+2` |
|`加一於二。 ` | `2+1` |
|`加一以二。乘其以三。 ` | `(1+2)*3` |
|`除十以三。所餘幾何。 ` | `10%3` |
|`減七百五十六以四百三十三。名之曰「甲」。 ` | `var a = 756-433;` |
|`夫「甲」「乙」中有陽乎。 ` | `a \|\| b` |
|`夫「甲」「乙」中無陰乎。 ` | `a && b` |


### 容器
數組下標從一開始。而不是零。

| wenyan | JavaScript |
|---|---|
|`吾有一列。名之曰「甲」。充「甲」以四。以二。 ` | `var a = []; a.push(4, 2);` |
|`銜「甲」以「乙」。以「丙」` | `a.concat(b).concat(c);` |
|`夫「甲」之一。 ` | `a[0]` |
|`夫「甲」之其餘。 ` | `a.slice(1);` |
|`夫「玫瑰」之「「名」」。 ` | `rose["name"]` |
|`夫「寶劍」之長。 ` | `sword.length;` |



### 對象

| wenyan | JavaScript |
|---|---|
|`吾有一物。名之曰「甲」。 ` | `var a = {};` |
|`吾有一物。名之曰「甲」。其物如是。物之「「乙」」者。數曰三。物之「「丙」」者。言曰「「丁」」。是謂「甲」之物也。 ` | `var a = {b:3, c:"d"}` |


### 函數

| wenyan | JavaScript |
|---|---|
|`吾有一術。名之曰「吸星大法」。是術曰。 ⋯⋯是謂「吸星大法」之術也。 `|`function f(){...}`|
|`吾有一術。名之曰「六脈神劍」。欲行是術。必先得六數。曰「甲」。曰「乙」。曰「丙」。曰「丁」。曰「戊」。曰「己」乃行是術曰。 ⋯⋯是謂「六脈神劍」之術也。 `|`function f(a,b,c,d,e,f){...}`|
|`吾有一術。名之曰「翻倍」。欲行是術。必先得一數。曰「甲」。乃行是術曰。乘「甲」以二。名之曰「乙」。乃得「乙」。是謂「翻倍」之術也。 `|`function double(a){var b = a * 2; return b;}`|
|`施「翻倍」於「大衍」。 `|`double(dayan);`|
|`吾有一術。名之曰「甲」。欲行是術。必先得一數曰「乙」。二言。曰「丙」。曰「丁」`|`function a(float b, string c, string d)`|
|`夫「甲」。夫「乙」。夫「丙」。取二以施「丁」。取二以施「戊」。名之曰「己」。 ` | `var f = e(a,d(b,c))`|
|`夫「甲」。夫「乙」。夫「丙」。取二以施「丁」。取二以施「戊」。取一以施「己」。夫「庚」。夫「辛」。取三以施「壬」。名之曰「癸」。 ` | `var j = i(f(e(a,d(b,c))),g,h)`|

### 導入

| wenyan | JavaScript |
|---|---|
|`吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」之義。 ` | `var {sin,cos} = require("math");` |

### 雜項

| wenyan | JavaScript |
|---|---|
|`吾有一數。曰五。書之。 `|`console.log(5);`|

### 註釋

| wenyan | JavaScript |
|---|---|
|`批曰。 「「文氣淋灕。字句切實」」。 ` | `/*文氣淋灕。字句切實*/` |
|`注曰。 「「文言備矣」」。 ` | `/*文言備矣*/` |
|`疏曰。 「「居第一之位故稱初。以其陽爻故稱九」」。 ` | `/*居第一之位故稱初。以其陽爻故稱九*/` |


## 渲染器

```bash
wenyan examples/turing.wy --render 圖靈機 --output .
```

`src/render.js` 腳本文件能把 `wy` 程式碼格式化輸出成為古漢語書籍樣式(歷史印刷書籍)的可縮放向量圖形(SVG)。同時它還可以將產生的SVG文件解析回原始文言程式碼。需要獲取更詳細的訊息,請使用`wenyan -h`命令來獲取幫助。

下圖是用 wenyan 編寫的 通用圖靈機程序 渲染而成。

![](screenshots/screenshot03.png)

## 功能請求

在你打開一個新Issue之前,請先檢查你的需求是否屬於以下類別:

|名稱|優先級|需要幫助|狀態|
|---|---|---|---|
|[語言規範](https://github.com/wenyan-lang/wenyan/issues/1)| ***** | | 正在進行中 |
|[類](https://github.com/wenyan-lang/wenyan/issues/31) / [對象文法](https://github.com/wenyan-lang/wenyan/issues/20) | *** | | 對象文法已經添加 |
|[導入語句](https://github.com/wenyan-lang/wenyan/issues/100) | *** | | 導入語句已經添加 |
|標準庫([Math(數學)](https://github.com/wenyan-lang/wenyan/issues/55)/[Bitwise ops(位運算)](https://github.com/wenyan-lang/wenyan/issues/2)/[Random(隨機)](https://github.com/wenyan-lang/wenyan/issues/87)) | ***** | √ | 正在進行中 |
|[測試套件](https://github.com/wenyan-lang/wenyan/issues/38)| **** | √ | 正在進行中 |
|[Switch語句](https://github.com/wenyan-lang/wenyan/issues/53)| *** | | |
|[函數式程式設計](https://github.com/wenyan-lang/wenyan/issues/99) | *** | | |
|更嚴格的編譯器 | **** | | |
|其他語言的編譯器 | ** | √ | |
|[編輯器的附加元件](https://github.com/wenyan-lang/wenyan/issues/77) | ** | √ | 適用於VSCode, Vim, Sublime的附加元件已添加 |
|將[js](https://github.com/wenyan-lang/wenyan/issues/47)/[py](https://github.com/wenyan-lang/wenyan/issues/67)/ [anything](https://github.com/wenyan-lang/wenyan/issues/73) 轉換回wenyan(文言) | * | √ | |
|[轉義](https://github.com/wenyan-lang/wenyan/issues/84)/[產生](https://github.com/wenyan-lang/wenyan/issues/128) 特殊符號| *** | | |
|[對「「」」的替換語法](https://github.com/wenyan-lang/wenyan/issues/81)| ** | | |
|[對 。的替換語法](https://github.com/wenyan-lang/wenyan/issues/93)| ** | | |
|線上IDE 的[字體](https://github.com/wenyan-lang/wenyan/issues/5) 和[垂直文本](https://github.com/wenyan-lang/wenyan/issues/9) | ** | | |
|[將註釋呈現為小型內聯文本](https://github.com/wenyan-lang/wenyan/issues/148) | ** | | |
|更多示範 | ** | √ | |

如果你可以幫助我們實現一個在`需要幫助`下有`√`的功能,請放心提交一個PR。我們將非常感謝你!如果你想幫助我們實現其他功能,也請讓我們知道!謝謝。

## 已知問題
|名稱|優先級|需要幫助|狀態|
|---|---|---|---|
|[漢字到數字的轉換問題](https://github.com/wenyan-lang/wenyan/issues/114)| ***** | | |
|[漢字到數字轉換中多字符數字沒有被加入支援](https://github.com/wenyan-lang/wenyan/issues/130) | *** | | |


================================================
FILE: documentation/Compiler-API.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Compiler-API)

================================================
FILE: documentation/Importing.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Importing)

================================================
FILE: documentation/Macros.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Macros)

================================================
FILE: documentation/Nested-Function-Calls.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Function-Call)

================================================
FILE: documentation/PREFACE.md
================================================
> 夫[唐](https://en.wikipedia.org/wiki/Emperor_Yao)、[虞](https://en.wikipedia.org/wiki/Emperor_Shun)之世,[結繩而足治](https://ctext.org/book-of-changes/xi-ci-xia/zh),屈指而足算。是時豈料百代之後,計算機械之巧,精於[公輸](https://en.wikipedia.org/wiki/Lu_Ban)之[木鳶](https://en.wikipedia.org/wiki/Lu_Ban#Inventions),善於[武侯](https://en.wikipedia.org/wiki/Zhuge_Liang)之[流馬](https://en.wikipedia.org/wiki/Wooden_ox);程式語言之多,繁若[《天官》](https://ctext.org/shiji/tian-guan-shu/zh)之星宿,奇勝[《山經》](https://en.wikipedia.org/wiki/Classic_of_Mountains_and_Seas)之走獸。[鼠](https://golang.org/)、[蟹](https://www.rust-lang.org/)、[鑽](http://ruby-lang.org/)、[魚](https://fishshell.com/),或以速稱。[蛇](https://www.python.org/)、[象](https://www.php.net/)、[駱](https://www.perl.org/)、[犀](http://shop.oreilly.com/product/9780596805531.do),各爭文采。方知[鬼之所以夜哭,天之所以雨粟](https://ctext.org/huainanzi/ben-jing-xun/zh)。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。[嗟予小子](https://zh.wikisource.org/zh-hant/%E6%A6%AE%E6%9C%A8_(%E9%99%B6%E6%B7%B5%E6%98%8E)),遂有斯志。然則數寸之烏絲猶覆於頭,[萬卷之素書未破於手](https://zh.wikisource.org/zh-hant/%E5%A5%89%E8%B4%88%E9%9F%8B%E5%B7%A6%E4%B8%9E%E4%B8%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E9%9F%BB);一身長羁于远邦,兩耳久旷于[雅言](https://zh.wikipedia.org/wiki/%E9%9B%85%E9%9F%B3)。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故[希孟](https://en.wikipedia.org/wiki/Wang_Ximeng)不慚年少,[莊生](https://en.wikipedia.org/wiki/Zhuang_Zhou)不望[無涯](https://ctext.org/zhuangzi/nourishing-the-lord-of-life/zh)。乃作斯言。誠未能嘔瀝[長吉](https://en.wikipedia.org/wiki/Li_He)之[心血](https://zh.wikisource.org/zh-hant/%E6%9D%8E%E8%B3%80%E5%B0%8F%E5%82%B3),亦庶幾免於[義山](https://en.wikipedia.org/wiki/Li_Shangyin)之[流沫](https://zh.wikisource.org/zh-hant/%E9%9F%93%E7%A2%91)。既成之後,復學[干將鑄劍](https://zh.wikisource.org/wiki/%E9%91%84%E5%8A%8D)而自飼,[越王嚐糞](https://ctext.org/wu-yue-chun-qiu/yue-wang-gou-jian-wu-nian/zh)而當先。自謂偶追[《十書》](https://en.wikipedia.org/wiki/Ten_Computational_Canons)之筆意,但恨少[八家](https://en.wikipedia.org/wiki/Eight_Masters_of_the_Tang_and_Song)之淋漓。此[子山](https://en.wikipedia.org/wiki/Yu_Xin)所謂[士衡抚掌而甘心,平子見陋而固宜](https://zh.wikisource.org/zh-hant/%E5%93%80%E6%B1%9F%E5%8D%97%E8%B3%A6)。然則雖實[覆甕](https://zh.wikisource.org/zh-hant/%E6%99%89%E6%9B%B8/%E5%8D%B7092#%E5%B7%A6%E6%80%9D)之質,尚存斧正之望;雖乏[呂相](https://en.wikipedia.org/wiki/L%C3%BC_Buwei)之金,[易字](https://zh.wikisource.org/zh/%E5%8F%B2%E8%A8%98/%E5%8D%B7085)之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。

================================================
FILE: documentation/Runtime.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Brower-Runtime)

================================================
FILE: documentation/Standard-Lib.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Standard-Library-Cheatsheet)

================================================
FILE: documentation/TODO.md
================================================
- ~~multiple push to array~~
- ~~syntax highlighting~~
- auto indent / format
- ~~compile to python~~
- compile to c
- ~~logical and / or~~
- ~~for loop with iterator~~
- ~~while loop~~
- ASC edge case near end of program
- ~~strict parse error checking~~
- ~~traditional chinese~~
- ~~negative numbers~~
- source mapping

================================================
FILE: documentation/Testing.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Testing)

================================================
FILE: documentation/Try-Catch.md
================================================
This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Error-Handling)

================================================
FILE: documentation/wenyan.g4
================================================
grammar wenyan;
program                     : statement* ;
statement                   : declare_statement
                            | define_statement
                            | print_statement 
                            | for_statement
                            | function_statement
                            | if_statement
                            | return_statement
                            | math_statement
                            | assign_statement
                            | import_statement
                            | object_statement
                            | reference_statement
                            | array_statement
                            | flush_statement 
                            | BREAK
                            | comment;

reference_statement         : '夫' data ('之' (STRING_LITERAL|INT_NUM|'其餘'|IDENTIFIER|'長'))? name_single_statement? ;


array_statement             : array_cat_statement|array_push_statement ;
array_cat_statement         : '銜' (IDENTIFIER|'其') (PREPOSITION_RIGHT IDENTIFIER)+ name_single_statement?;
array_push_statement        : '充' (IDENTIFIER|'其') (PREPOSITION_RIGHT data)+ name_single_statement?;


function_statement          : function_define_statement|(function_call_statement (name_single_statement)?) ;
function_call_statement     : function_pre_call|function_post_call ;
function_pre_call           : ('施' IDENTIFIER (preposition data)*)|('施其' (preposition data)*) ;
function_post_call          : ('取' INT_NUM '以施' IDENTIFIER)+ ;
function_define_statement   : '吾有' INT_NUM '術' name_single_statement ('欲行是術' '必先得' (INT_NUM TYPE ('曰' IDENTIFIER)+)+)? ('是術曰'|'乃行是術曰') statement* '是謂' IDENTIFIER '之術也' ;


if_statement                : IF if_expression '者' statement+ (ELSE statement+)? FOR_IF_END ;
if_expression               : unary_if_expression|binary_if_expression ;
unary_if_expression         : data|(IDENTIFIER '之'('長'|STRING_LITERAL|IDENTIFIER))|'其' ;
binary_if_expression        : unary_if_expression IF_LOGIC_OP unary_if_expression ;


declare_statement           : ('吾有'|'今有') INT_NUM TYPE ('曰' data)*;
define_statement            : (declare_statement name_multi_statement)|init_define_statement ;


name_multi_statement        : '名之' ('曰' IDENTIFIER)+ ;
name_single_statement       : '名之' ('曰' IDENTIFIER) ;
init_define_statement       : '有' TYPE data (name_single_statement)? ;


for_statement               : for_arr_statement
                            | for_enum_statement
                            | for_while_statement ;
for_arr_statement           : FOR_START_ARR   IDENTIFIER            FOR_MID_ARR  IDENTIFIER statement* FOR_IF_END ; 
for_enum_statement          : FOR_START_ENUM  (INT_NUM|IDENTIFIER)  FOR_MID_ENUM statement* FOR_IF_END ;
for_while_statement         : FOR_START_WHILE statement*            FOR_IF_END ;


math_statement              : (arith_math_statement|boolean_algebra_statement|mod_math_statement) (name_multi_statement)? ;
arith_math_statement        : arith_binary_math|arith_unary_math ;
arith_binary_math           : ARITH_BINARY_OP (data|'其') preposition (data|'其') ;
arith_unary_math            : UNARY_OP (IDENTIFIER|'其') ;
mod_math_statement          : '除' (INT_NUM|FLOAT_NUM|IDENTIFIER|'其') preposition (INT_NUM|FLOAT_NUM|IDENTIFIER) POST_MOD_MATH_OP? ;
boolean_algebra_statement   : '夫' IDENTIFIER IDENTIFIER LOGIC_BINARY_OP ;


assign_statement            : '昔之' IDENTIFIER ('之' (INT_NUM|STRING_LITERAL|IDENTIFIER))? '者' (('今' ((data ('之' INT_NUM)?)|'其') '是矣')|'今不復存矣') ;


return_statement            : '乃得' (data|'其')|'乃歸空無'|'乃得矣' ;


import_statement            : '吾嘗觀' STRING_LITERAL '之書' ('方悟' IDENTIFIER+ '之義')? ;


object_statement            : '吾有' INT_NUM '物' name_multi_statement (object_define_statement)? ;
object_define_statement     : '其物如是' ('物之' STRING_LITERAL '者' TYPE '曰' data)+ '是謂' IDENTIFIER '之物也' ;


data                        : STRING_LITERAL|BOOL_VALUE|IDENTIFIER|INT_NUM|FLOAT_NUM ;

STRING_LITERAL              : '「「' ( ~('」') )* '」」' ;
IDENTIFIER                  : '「' ( ~('」') )+ '」' ;

ARITH_BINARY_OP             : '加'|'減'|'乘' ;
LOGIC_BINARY_OP             : '中有陽乎'|'中無陰乎' ;
POST_MOD_MATH_OP            : '所餘幾何' ;
UNARY_OP                    : '變' ;

preposition                 : PREPOSITION_LEFT|PREPOSITION_RIGHT ;
PREPOSITION_LEFT            : '於' ;
PREPOSITION_RIGHT           : '以' ;

IF                          : '若' ;
ELSE                        : '若非' ;
IF_LOGIC_OP                 : '等於'|'不等於'|'不大於'|'不小於'|'大於'|'小於' ;

FOR_START_ARR               : '凡' ;
FOR_START_ENUM              : '為是' ;
FOR_START_WHILE             : '恆為是' ;
FOR_MID_ARR                 : '中之' ;
FOR_MID_ENUM                : '遍' ;
FOR_IF_END                  : '云云'|'也' ;

FLOAT_NUM                   : INT_NUM '又' (INT_NUM FLOAT_NUM_KEYWORDS)+ ;
FLOAT_NUM_KEYWORDS          : '分'|'釐'|'毫'|'絲'|'忽'|'微'|'塵'|'埃'|'渺'|'漠' ;
INT_NUM                     : INT_NUM_KEYWORDS+ ;

INT_NUM_KEYWORDS            : '零'|'一'|'二'|'三'|'四'|'五'|'六'|'七'|'八'|'九'|'十'|'百'|'千'|'萬'|'億'|'兆'|'京'|'垓'|'秭'|'穣'|'溝'|'澗'|'正'|'載'|'極' ;
TYPE                        : '數'|'列'|'言'|'爻' ;
BOOL_VALUE                  : '陰'|'陽' ;
print_statement             : '書之' ;

WS                          : ([ \t\r\n]|'。'|'、')+ -> skip ;
comment                     : ('注曰'|'疏曰'|'批曰') STRING_LITERAL ;
flush_statement             : '噫' ;

BREAK                       : '乃止' ;


================================================
FILE: examples/README.md
================================================
<!-- GENERATED FILE, DO NOT MODIFY -->
<!-- "npm run build:docs" to regenerate -->

# Examples

| File                                   | Remark                    |
| -------------------------------------- | ------------------------- |
| [beer.wy](beer.wy)                     | 九十九瓶啤酒              |
| [breadth_first_search.wy](breadth_first_search.wy)  | 廣度優先搜索 |
| [clock.wy](clock.wy)                   | 畫鐘                      |
| [collatz.wy](collatz.wy)               | 考拉兹猜想                |
| [collatz2.wy](collatz2.wy)             | 考拉兹猜想二              |
| [crt.wy](crt.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)           | 斐氏列                    |
| [fibonacci_array.wy](fibonacci_array.wy)  | 斐氏列三               |
| [fibonacci2.wy](fibonacci2.wy)         | 斐氏列二                  |
| [fizzbuzz.wy](fizzbuzz.wy)             | [嘶嘶嗡嗡][1]             |
| [hanoi.wy](hanoi.wy)                   | 漢諾塔                    |
| [hanoi_stack.wy](hanoi_stack.wy)       | 漢諾塔二                  |
| [helloworld.wy](helloworld.wy)         | 問天地好在                |
| [helloworld+.wy](helloworld+.wy)       | 問天地好在+               |
| [import.wy](import.wy)                 | 導入示例                  |
| [linglong_tower.wy](linglong_tower.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)                       | 对象示例                  |
| [pascal_triangle.wy](pascal_triangle.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)   | 選擇排序                  |
| [serialization.wy](serialization.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)                 | 圖靈機                    |
| [zh_sqrt.wy](zh_sqrt.wy)               | 增乘開平方                |

[1]: https://en.wikipedia.org/wiki/Fizz_buzz
[2]: https://zh.wikipedia.org/wiki/自產生程式


================================================
FILE: examples/beer.wy
================================================
吾有一言。曰「「春日宴。」」。書之。
有數九。名之曰「酒數」。

恆為是。若「酒數」等於零者乃止也。

	吾有三言。曰「「與君」」。曰「酒數」。
		曰「「杯酒。可以窮歡宴。綠酒一杯歌一遍。」」。書之。

減「酒數」以一。昔之「酒數」者。今其是矣云云。

吾有一言。曰「「綠酒千杯腸已爛。」」。書之。

================================================
FILE: examples/breadth_first_search.wy
================================================
注曰。「「廣度優先搜索」」。

吾有一數。曰五。名之曰「長」。	注曰。「「節點的數量」」。
吾有一列。名之曰「橋」。 注曰。「「鄰接數組」」。

吾有二數。曰一。曰五。名之曰「開始」曰「終點」。

注曰。「「相鄰節點。
一到二。一到三。
二到一。二到四。二到五。
三到一。三到四。四到二。
四到三。四到五。
五到二。五到四。」」

吾有一列。名之曰「東」。
充「東」以一。以一。以二。以二。以二。以三。以三。以四。以四。以四。以五。以五。
吾有一列。名之曰「南」。
充「南」以二。以三。以一。以四。以五。以一。以四。以二。以三。以五。以二。以四。

吾有一列。名之曰「步」。

為是「長」遍。
	吾有一列。名之曰「乙」。
	充「橋」以「乙」。
	充「步」以千千。
云云。	

吾有一數。曰一。名之曰「甲」。	
夫「東」之長。名之曰「丁」。為是「丁」遍。
	夫「東」之「甲」。名之曰「東岸」。夫「南」之「甲」。名之曰「南岸」。
	夫「橋」之「東岸」。名之曰「衍」。充「衍」以「南岸」。
	昔之「橋」之「東岸」者。今「衍」是矣。
	加「甲」以一。名之曰「丙」。昔之「甲」者。今「丙」是矣。
云云。	

吾有一列。名之曰「營」。注曰。「「队列」」
充「營」以「開始」。
昔之「步」之「開始」者。今零是矣。

吾有一術。名之曰「過河拆橋」。欲行是術。必先得二數。曰「營」。曰「辛」。乃行是術曰。
	吾有一列。名之曰「乙」。
	吾有一數。曰一。名之曰「甲」。減「辛」以一。名之曰「壬」。為是「壬」遍。
		夫「營」之「甲」。名之曰「戊」。充「乙」以「戊」。
		加「甲」以一。名之曰「丙」。昔之「甲」者。今「丙」是矣。
	云云。
	乃得「乙」。
是謂「過河拆橋」之術也。	

恆為是。
	夫「營」之長。名之曰「辛」。
	若「辛」不大於零者。
		乃止。	
	也。
	夫「營」之「辛」。名之曰「前」。
	施「過河拆橋」於「營」於「辛」。名之曰「乙」。
	昔之「營」者。今「乙」是矣。	
	夫「步」之「前」。名之曰「上」。加「上」以一。名之曰「正」。
	夫「橋」之「前」。名之曰「癸」。凡「癸」中之「丁」。
		夫「步」之「丁」。名之曰「下」。
		若「下」大於「正」者。
			昔之「步」之「丁」者。今「正」是矣。
			充「營」以「丁」。
		也。
	云云。
云云。

夫「步」之「終點」。書之。

================================================
FILE: examples/clock.wy
================================================
吾嘗觀「「曆法」」之書。方悟「今何紀元時」「彼時何小時」「彼刻何刻」「彼分何分」「彼秒何秒」之義。
吾嘗觀「「畫譜」」之書。方悟「備紙」「擇筆」「蘸色」「落筆」「運筆」「提筆」「設色」「裱畫」之義。
吾嘗觀「「算經」」之書。方悟「倍圓周率」「正弦」「餘弦」之義。

施「今何紀元時」。名之曰「紀元時」。
施「彼時何小時」於「紀元時」。名之曰「小時」。
施「彼刻何刻」於「紀元時」。名之曰「刻」。
施「彼分何分」於「紀元時」。名之曰「分」。
施「彼秒何秒」於「紀元時」。名之曰「秒」。

有數四百。名之曰「紙縱」。
有數四百。名之曰「紙橫」。
除二於「紙縱」。名之曰「半縱」。
除二於「紙橫」。名之曰「半橫」。
吾有一數。名之曰「比例」。

若「半橫」小於「半縱」者。
	昔之「比例」者。今「半橫」是矣。
若非。
	昔之「比例」者。今「半縱」是矣。
云云。

吾有一術。名之曰「縱坐標」。欲行是術。必先得一數。曰「南」。是術曰。
	乘「南」以「比例」。減其於「半縱」。乃得矣。
是謂「縱坐標」之術也。

吾有一術。名之曰「橫坐標」。欲行是術。必先得一數。曰「東」。是術曰。
	乘「東」以「比例」。減其於「半橫」。乃得矣。
是謂「橫坐標」之術也。

吾有一術。名之曰「極坐標」。欲行是術。必先得二數。曰「距」。曰「角」。是術曰。
	施「餘弦」於「角」。乘其以「距」。取一以施「縱坐標」。名之曰「縱」。
	施「正弦」於「角」。乘其以「距」。取一以施「橫坐標」。名之曰「橫」。
	吾有一物。名之曰「坐標」。其物如是。
		物之「「橫」」者。數曰「橫」。
		物之「「縱」」者。數曰「縱」。
	是謂「坐標」之物也。乃得「坐標」。
是謂「極坐標」之術也。

吾有一術。名之曰「畫鐘面」。
欲行是術。必先得一物。曰「紙」。一數。曰「半徑」。
是術曰。

	有數一千零二十四。名之曰「割圓」。
	夫「半徑」。夫零。取二以施「極坐標」。名之曰「始坐標」。
	夫「紙」。夫「始坐標」之「「橫」」。夫「始坐標」之「「縱」」。取三以施「落筆」。

	有數一。名之曰「甲」。
	為是「割圓」遍。
		除「甲」以「割圓」。乘其以「倍圓周率」。名之曰「乙」。
		夫「半徑」。夫「乙」。取二以施「極坐標」。名之曰「坐標」。
		夫「紙」。夫「坐標」之「「橫」」。夫「坐標」之「「縱」」。取三以施「運筆」。
		加「甲」以一。昔之「甲」者。今其是矣。
	云云。

	施「蘸色」於「紙」於「「鈦白」」。
	施「設色」於「紙」。
	施「蘸色」於「紙」於「「黑」」。
	施「提筆」於「紙」。

	有數零。名之曰「丙」。

	為是六十遍。
		除「丙」以六十。乘其以「倍圓周率」。名之曰「丁」。
		夫「半徑」。夫「丁」。取二以施「極坐標」。名之曰「正刻外坐標」。
		夫「紙」。夫「正刻外坐標」之「「橫」」。夫「正刻外坐標」之「「縱」」。取三以施「落筆」。
		乘九分五於「半徑」。夫「丁」。取二以施「極坐標」。名之曰「正刻內坐標」。
		夫「紙」。夫「正刻內坐標」之「「橫」」。夫「正刻內坐標」之「「縱」」。取三以施「運筆」。
		施「提筆」於「紙」。

		加「丙」以一。昔之「丙」者。今其是矣。
	云云。


	有數零。名之曰「丙」。

	為是十二遍。
		除「丙」以十二。乘其以「倍圓周率」。名之曰「戊」。
		夫「半徑」。夫「戊」。取二以施「極坐標」。名之曰「初刻外坐標」。
		夫「紙」。夫「初刻外坐標」之「「橫」」。夫「初刻外坐標」之「「縱」」。取三以施「落筆」。
		乘八分五於「半徑」。夫「戊」。取二以施「極坐標」。名之曰「初刻內坐標」。
		夫「紙」。夫「初刻內坐標」之「「橫」」。夫「初刻內坐標」之「「縱」」。取三以施「運筆」。
		施「提筆」於「紙」。

		加「丙」以一。昔之「丙」者。今其是矣。
	云云。

是謂「畫鐘面」之術也。

吾有一術。名之曰「畫指針」。
欲行是術。必先得一物。曰「紙」。五數。曰「角」。曰「針長」。曰「尾長」。曰「針角」。曰「尾角」。
是術曰。

	夫「針長」。加「針角」於「角」。取二以施「極坐標」。名之曰「甲」。
	乘負一於「尾長」。減「尾角」於「角」。取二以施「極坐標」。名之曰「乙」。
	乘負一於「尾長」。加「尾角」於「角」。取二以施「極坐標」。名之曰「丙」。
	夫「針長」。減「針角」於「角」。取二以施「極坐標」。名之曰「丁」。

	夫「紙」。夫「甲」之「「橫」」。夫「甲」之「「縱」」。取三以施「落筆」。
	夫「紙」。夫「乙」之「「橫」」。夫「乙」之「「縱」」。取三以施「運筆」。
	夫「紙」。夫「丙」之「「橫」」。夫「丙」之「「縱」」。取三以施「運筆」。
	夫「紙」。夫「丁」之「「橫」」。夫「丁」之「「縱」」。取三以施「運筆」。
	夫「紙」。夫「甲」之「「橫」」。夫「甲」之「「縱」」。取三以施「運筆」。

	施「蘸色」於「紙」於「「花青」」。
	施「設色」於「紙」。

是謂「畫指針」之術也。

吾有一術。名之曰「执笔」。是術曰。

	施「(()=>document.getElementById("out").innerHTML="")」。
	施「今何紀元時」。名之曰「紀元時」。
	施「彼時何小時」於「紀元時」。名之曰「時」。
	施「彼分何分」於「紀元時」。名之曰「分」。
	施「彼刻何刻」於「紀元時」。名之曰「刻」。
	施「彼秒何秒」於「紀元時」。名之曰「秒」。

	乘「刻」以十五。加其於「分」。昔之「分」者。今其是矣。

	除「秒」以六十。加其於「分」。昔之「分」者。今其是矣。
	除「分」以六十。加其於「時」。昔之「時」者。今其是矣。

	除「分」以六十。乘其以「倍圓周率」。乘其以負一。名之曰「分角」。
	除「時」以十二。乘其以「倍圓周率」。乘其以負一。名之曰「時角」。
	除「秒」以六十。乘其以「倍圓周率」。乘其以負一。名之曰「秒角」。


	施「備紙」於「紙橫」。於「紙縱」。名之曰「紙」。
	施「畫鐘面」於「紙」。於九分。
	施「畫指針」於「紙」。於「秒角」。於八分。於一分。於三毫。於一分。
	施「畫指針」於「紙」。於「分角」。於七分五釐。於一分。於三毫。於三分。
	施「畫指針」於「紙」。於「時角」。於五分五釐。於八釐。於五毫。於五分。
	施「裱畫」於「紙」於「「out」」。

是謂「执笔」之術也。

施「(x=>setInterval(x, 500))」於「执笔」。

================================================
FILE: examples/collatz.wy
================================================
吾有一術。名之曰「角谷猜想」。
欲行是術。必先得一數。
曰「甲」。
乃行是術曰。
	吾有一術。名之曰「助手」。
	欲行是術。必先得一數。
	曰「乙」。
	乃行是術曰。
		吾有一數。名之曰「埃」。
		除「乙」以二。所餘幾何。名之曰「積」。
		若「積」不等於零者。乘三以「乙」。加其於一。昔之「埃」者。今其是矣。
		若非。 除二於「乙」。昔之「埃」者。今其是矣。云云。
		乃得「埃」。
	是謂「助手」之術也。

	吾有一列。名之曰「回」。充「回」以「甲」。
	恆為是。
		若「甲」等於一者。乃止。也。
		施「助手」於「甲」。昔之「甲」者。今其是矣。
		充「回」以「甲」。
	云云。
	充「回」以一。
	乃得「回」。
是謂「角谷猜想」之術也。

施「角谷猜想」於十二。書之。
施「角谷猜想」於十九。書之。
施「角谷猜想」於二十七。書之。

================================================
FILE: examples/collatz2.wy
================================================
吾有一術。名之曰「考拉茲」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	有數零。名之曰「總」。
	為是九千九百九十九遍。
		若「甲」等於一者。乃得「總」。
		若非。
			除「甲」以二。所餘幾何。名之曰「丙」。
			若「丙」等於零者。除「甲」以二。名之曰「半」。昔之「甲」者。今「半」也。
			若非。
				乘「甲」以三。名之曰「丁」。加一於「丁」。名之曰「戊」。昔之「甲」者。今「戊」是也。
			加「總」以一。名之曰「己」。
			昔之「總」者。今「己」是也。
	云云。
是謂「考拉茲」之術也。


施「考拉茲」於一十八。書之。
施「考拉茲」於一百二十三。書之。
施「考拉茲」於九百七十八。書之。
施「考拉茲」於六。書之。


================================================
FILE: examples/crt.wy
================================================
吾有一術。名之曰「大衍總數」。欲行是術。必先得二列。曰「諸元」。曰「諸餘」。乃行是術曰。
注曰「「
	以定相乘為衍母。
	以各定約衍母。得各衍數。
	諸衍數。各滿定母去之。不滿曰奇。
	以奇與定。用大衍求一入之。以求乘率。
	置各乘率。對乘衍數。得用。
	以其餘各乘用。為各總。
	併總。滿衍母去之。不滿。為所求率數。
」」

	施「求諸定」於「諸元」。名之曰「諸定」。

	施「相乘」於「諸定」。名之曰「衍母」。
	注曰「「衍母者。即諸定數皆能度盡之數也」」。

	吾有一列。名之曰「諸總」。
	夫「諸定」之長。名之曰「量」。
	有數〇。名之曰「序」。恆為是。若「序」等於「量」者乃止也。
		加「序」以一。昔之「序」者。今其是矣。
		夫「諸定」之「序」。名之曰「定」。
		夫「諸餘」之「序」。名之曰「餘」。
		若「定」等於一者乃止是遍也。
		注曰「「定數一者。即無用數」」。

		除「衍母」以「定」。名之曰「衍」。
		注曰「「衍數者。即諸數度盡一數度不盡之數也」」。

		除「衍」以「定」。所餘幾何。名之曰「奇」。
		注曰「「奇數者。定數度衍數不盡之數也」」。

		施「大衍求一」於「奇」於「定」。名之曰「果」。
		夫「果」之「「乘率」」。名之曰「乘率」。

		乘「衍」以「乘率」。名之曰「用」。
		注曰「「用數者。即一數餘一諸數度盡之數也」」。

		乘「用」以「餘」。名之曰「總」。充「諸總」以「總」。
		注曰「「蓋用數為諸數度盡一數餘一之數。以幾數乘之。必為諸數度盡一數餘幾數之數也」」。
	云云。

	施「相加」於「諸總」。除其以「衍母」。所餘幾何。名之曰「率」。
	注曰「「併各條而以各數度之。必各數仍餘。幾數也餘。數悉合。則總數必合矣」」。
	乃得「率」。
是謂「大衍總數」之術也。

注曰「「
	然衍母為諸數度盡之數。累加一衍母眾餘數皆不變。
	故滿衍母去之。得在衍母內者。
	其數最小為第一。數若大於此數者。遞加一衍母數。無不合者。
」」


吾有一術。名之曰「求諸定」。欲行是術。必先得一列。曰「諸元」。乃行是術曰。
注曰「「
	元數者。先以兩兩連環求等。
	約奇弗約偶。
	或約得五。而彼有十。乃約偶而弗約奇。
	或元數俱偶。約畢可存一位見偶。
	或皆約而猶有類數存。姑置之。俟與其他約遍。而後乃與姑置者求等約之。
	或諸數皆不可盡類。則以諸元數命曰定數。
」」

	夫「諸元」之長。名之曰「量」。
	有數〇。名之曰「甲序」。恆為是。若「甲序」等於「量」者乃止也。
		加「甲序」以一。昔之「甲序」者。今其是矣。

		有數〇。名之曰「乙序」。恆為是。若「乙序」等於「量」者乃止也。
			加「乙序」以一。昔之「乙序」者。今其是矣。
			若「乙序」等於「甲序」者乃止是遍也。

			夫「諸元」之「甲序」。名之曰「甲」。
			夫「諸元」之「乙序」。名之曰「乙」。
			施「大衍求一」於「甲」於「乙」。名之曰「果」。
			夫「果」之「「等數」」。名之曰「等」。

			除「甲」以「等」。名之曰「約甲」。
			除「乙」以「等」。名之曰「約乙」。
			除「約甲」以「等」。所餘幾何。若其不等於〇者。
				昔之「諸元」之「甲序」者。今「約甲」是矣。
			若非。
				昔之「諸元」之「乙序」者。今「約乙」是矣也。
	云云。云云。
	乃得「諸元」。
是謂「求諸定」之術也。

吾有一術。名之曰「相乘」。欲行是術。必先得一列。曰「諸數」。乃行是術曰。
	有數一。名之曰「積」。
	凡「諸數」中之「數」。乘「積」以「數」。昔之「積」者。今其是矣。云云。
	乃得「積」。
是謂「相乘」之術也。
吾有一術。名之曰「相加」。欲行是術。必先得一列。曰「諸數」。乃行是術曰。
	有數〇。名之曰「和」。
	凡「諸數」中之「數」。加「和」以「數」。昔之「和」者。今其是矣。云云。
	乃得「和」。
是謂「相加」之術也。

吾有一術。名之曰「大衍求一」。欲行是術。必先得二數。曰「奇」。曰「定」。乃行是術曰。
注曰「「
	大衍求一術云。
	置奇右上。定居右下。立天元一於左上。
	先以右上除右下。所得商數與左上一相生。入左下。然後乃以右行上下。
	以少除多。遞互除之。所得商數隨即遞互累乘。歸左行上下。
	須使右上末後奇一而止。乃驗左上所得。以為乘率。
	或奇數已見單一者。便為乘率。
」」
	若「奇」等於〇者。
		吾有一物。名之曰「果」。其物如是。
			物之「「乘率」」者。數曰〇。
			物之「「等數」」者。數曰「定」。
		是謂「果」之物也。
		乃得「果」也。
	若「奇」等於一者。
		吾有一物。名之曰「果」。其物如是。
			物之「「乘率」」者。數曰一。
			物之「「等數」」者。數曰一。
		是謂「果」之物也。
		乃得「果」也。

	有數一。名之曰「天元」。
	吾有四數。曰「奇」曰「定」曰「天元」曰〇。
		名之曰「右上」曰「右下」曰「左上」曰「左下」。

	恆為是。
		若「右上」等於一者。乃止也。

		除「右下」以「右上」。所餘幾何。名之曰「餘」。
		減「右下」以「餘」。除其以「右上」。名之曰「商」。
		乘「商」以「左上」。加「左下」以其。昔之「左下」者。今其是矣。
		昔之「右下」者。今「餘」是矣。

		若「右下」等於〇者。乃止也。

		減「右上」以一。除其以「右下」。所餘幾何。加其以一。名之曰「餘」。
		減「右上」以「餘」。除其以「右下」。名之曰「商」。
		乘「商」以「左下」。加「左上」以其。昔之「左上」者。今其是矣。
		昔之「右上」者。今「餘」是矣。
	云云。

	吾有一物。名之曰「果」。其物如是。
		物之「「乘率」」者。數曰「左上」。
		物之「「等數」」者。數曰「右上」。
	是謂「果」之物也。
	注曰「「右上者等數也。若右下等於〇者。曰奇數與定數不互素。無乘率也。」」
	若「右下」等於〇者。昔之「果」之「「乘率」」者。今〇是矣也。
	乃得「果」。
是謂「大衍求一」之術也。



吾有一術。名之曰「置諸問」。欲行是術。必先得二列。曰「諸元」曰「諸餘」。二數。曰「元」曰「餘」。乃行是術曰。
	充「諸元」以「元」。
	充「諸餘」以「餘」。
是謂「置諸問」之術也。

或云「「有物不知其數」」。
蓋謂「「吾有二列。名之曰「諸元」曰「諸餘」。施「置諸問」於「諸元」於「諸餘」。名之曰「置問」」」。

或云「「以「甲」數之剩「乙」也」」。
蓋謂「「施「置問」於「甲」於「乙」。名之曰「各問」」」。

或云「「問物幾何」」。
蓋謂「「施「大衍總數」於「諸元」於「諸餘」」」。

有物不知其數。以三數之剩二也。以五數之剩三也。問物幾何。書之。
有物不知其數。以三數之剩二也。以五數之剩三也。以七數之剩二也。問物幾何。書之。
有物不知其數。以八四數之剩二三也。以一六〇數之剩七也。以六三數之剩二也。問物幾何。書之。
有物不知其數。以三二數之剩七也。以九數之剩二也。以五數之剩二也。以七數之剩二也。問物幾何。書之。


================================================
FILE: examples/divination.wy
================================================
吾嘗觀「「易經」」之書。方悟「占」「運」之義。
吾嘗觀「「算經」」之書。方悟「取底」之義。

施「運」於十三。

吾有一術。名之曰「听天由命」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「占」。名之曰「乙」。乘「甲」以「乙」。名之曰「丙」。施「取底」於「丙」。乃得其。
是謂「听天由命」之術也。

吾有一術。名之曰「春秋古筮法」。欲行是術。必先得一數。曰「现余策」。乃行是術曰。
	吾有一數。曰零。名之曰「左余策」。
	吾有一數。曰零。名之曰「左剩策」。
	吾有一數。曰零。名之曰「右余策」。
	吾有一數。曰零。名之曰「右剩策」。

	減「现余策」以一。名之曰「现余策」。

	減「现余策」以一。
	昔之「现余策」者。今其是矣。
	施「听天由命」於「现余策」。
	昔之「左余策」者。今其是矣。
	加「现余策」以一。
	昔之「现余策」者。今其是矣。
	加「左余策」以一。
	昔之「左余策」者。今其是矣。

	減「现余策」以「左余策」。
	昔之「右余策」者。今其是矣。
	批曰。「「分而为二以象两」」

	除「左余策」以四。所餘幾何。批曰。「「揲之以四象四时」」
	昔之「左剩策」者。今其是矣。
	若「左剩策」等於零者。
		昔之「左剩策」者。今四是矣。
	云云。
	除「右余策」以四。所餘幾何。
	昔之「右剩策」者。今其是矣。
	若「右剩策」等於零者。
		昔之「右剩策」者。今四是矣。
	云云。

	減「现余策」以「左剩策」。
	昔之「现余策」者。今其是矣。
	減「现余策」以「右剩策」。
	昔之「现余策」者。今其是矣。
	乃得 「现余策」。

是謂「春秋古筮法」之術也。

吾有一列。名之曰「爻基」。
吾有一數。曰六。名之曰「甲」。
恆為是。
	若「甲」等於零者。乃止。云云。
	吾有一數。曰五十。名之曰「余策」。批曰。「「大衍之数五十」」
	減「余策」以一。昔之「余策」者。今其是矣。批曰。「「其用四十有九」」
	為是三遍。批曰。「「三变成一爻」」
		施「春秋古筮法」於「余策」
		昔之「余策」者。今其是矣。
	云云。
	充「爻基」以「余策」。
	減「甲」以一。
	昔之「甲」者。今其是矣。
云云。

昔之「甲」者。今六是矣。
吾有一數。曰零。名之曰「判據」。
恆為是。
	若「甲」等於零者。乃止。云云。

	夫「爻基」之「甲」。除其以四。
	除其以二。所餘幾何。
	昔之「判據」者。今其是矣。

	若「判據」等於零者。
		吾有一言。曰「「-- --」」。書之。
	若非
		吾有一言。曰「「-----」」。書之。
	云云。

	減「甲」以一。
	昔之「甲」者。今其是矣。
云云。

================================================
FILE: examples/draw_heart.wy
================================================
吾嘗觀「「算經」」之書。方悟「絕對」「平方根」之義。

吾有一術名之曰「畫心」。
欲行是術。必先得一言。曰「心語」。
乃行是術曰。
	夫「心語」之長。名之曰「長度」。
	吾有一言。曰「「一」」。名之曰「填充符」。
	吾有一言。曰「「\n」」。名之曰「换行符」。 
	除十三以十。名之曰「乙」。
	除負十一以十。名之曰「乙止」。
	除四十以一千。名之曰「甲步長」。
	除六以一百。名之曰「乙步長」。
	吾有一數。曰一。名之曰「輸出位置」。
	吾有一言。曰「「」」。名之曰「果」。
	恆為是。若「乙」小於「乙止」者乃止也。
		除負十一以十。名之曰「甲」。
		除十一以十。名之曰「甲止」。
		吾有一言。曰「「」」。名之曰「本行」。
		恆為是。若「甲」大於「甲止」者乃止也。
			施「絕對」於「甲」。名之曰「甲絕對」。
			施「平方根」於「甲絕對」。名之曰「減數」。
			乘五於「乙」。除其以四。名之曰「被減數」。
			減「被減數」以「減數」。名之曰「差」。
			乘「差」以「差」。名之曰「加數」。
			乘「甲」以「甲」。加其以「加數」。減其以一。名之曰「函數值」。
			若「函數值」不大於零者。
				夫「心語」之「輸出位置」。名之曰「字」。
				加「本行」以「字」。昔之「本行」者今其是矣。
				除「輸出位置」以「長度」。所餘幾何。加其以一。昔之「輸出位置」者今其是矣。
			若非。
				加「本行」以「填充符」。昔之「本行」者今其是矣。
			也。
			加「甲」以「甲步長」。昔之「甲」者今其是矣。
		云云。
		減「乙」以「乙步長」。昔之「乙」者今其是矣。
		加「本行」以「换行符」。昔之「本行」者今其是矣。
		加「果」以「本行」。昔之「果」者今其是矣。
	云云。
	夫「果」。書之。
是謂「畫心」之術也。

施「畫心」於「「琉璃梳子撫青絲。畫心牽腸癡不癡。」」。

================================================
FILE: examples/eightqueens.wy
================================================
注曰。「「今以八皇后置棋盤之上而不相殺。其法幾何。」」

吾有一術。名之曰「皇后問題」。欲行是術。必先得一數。曰「寬」。乃行是術曰。
	吾有一列。名之曰「棋盤」。

	吾有一術。名之曰「單步」。是術曰。
		若「棋盤」之長等於「寬」者。
			夫「棋盤」書之。
		若非。
			吾有一數。曰一。名之曰「此后」。
			為是「寬」遍。
				吾有一爻。曰陽。名之曰「可乎」。
				吾有一數。曰一。名之曰「彼后之位」。
				夫「棋盤」之長。名之曰「幾何」。
				加一於「幾何」。名之曰「此后之位」。
				為是「幾何」遍。
					夫「棋盤」之「彼后之位」。名之曰「彼后」。
					減「此后之位」以「彼后之位」。名之曰「直距」。
					減「彼后」以「此后」。名之曰「右距」。
					減「彼后」於「此后」。名之曰「左距」。
					若「彼后」等於「此后」者。昔之「可乎」者。今陰也。乃止。也。
					若「右距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。
					若「左距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。
					加一於「彼后之位」。名之曰「新位」。
					昔之「彼后之位」者。今「新位」也。
				云云。
				若「可乎」者。
					吾有一列。銜其以「棋盤」。名之曰「舊棋盤」
					充「棋盤」以「此后」。
					施「單步」。噫。
					昔之「棋盤」者。今「舊棋盤」是矣。
				也。
				加一於「此后」。名之曰「新此后」。
				昔之「此后」者。今「新此后」也。
			云云。
		也。
	是謂「單步」之術也。

	施「單步」。
是謂「皇后問題」之術也。
 
施「皇后問題」於八。噫。


================================================
FILE: examples/euclidean.wy
================================================
吾有一術。名之曰「歐幾里得法」。
欲行是術。必先得二數。
曰「甲」。曰「乙」。
乃行是術曰。
		吾有一數。名之曰「回」。
		若「乙」等於零者。乃得「甲」是矣。
		若非
			吾有一數。名之曰「削除」。
			除「甲」以「乙」所餘幾何。昔之「削除」者。今其是矣。
			施「歐幾里得法」於「乙」。於「削除」。
			昔之「回」者。今其是矣。
		也
		乃得「回」。
是謂「歐幾里得法」之術也。

吾有一術。名之曰「互質」。
欲行是術。必先得二數。
曰「甲」。曰「乙」。
乃行是術曰。
		吾有一數。名之曰「回」。
		施「歐幾里得法」於「甲」。於「乙」。昔之「回」者。今其是矣。
		若「回」等於一者。乃得陽。若非。乃得陰。也。
是謂「互質」之術也。

吾有一術。名之曰「歐拉餘數」。
欲行是術。必先得一數。
曰「甲」。
乃行是術曰。
	注曰。「「非最優解矣。吾算術及數論廢也」」
	吾有二數。曰二。曰一。名之曰「埃」。曰「積」
	恆為是。
		若「甲」不大於「埃」者。乃止。也。
		吾有一爻。名之曰「回」。
		施「互質」於「甲」。於「埃」。昔之「回」者。今其是矣。
		若「回」者加「積」以一。名之曰「積」。也。
		加「埃」以一。名之曰「埃」。
	云云
	乃得「積」。
是謂「歐拉餘數」之術也。

施「歐幾里得法」於一千零七十一於四百六十二。書之。
施「歐幾里得法」於一百二十三於四。書之。

施「互質」於一百二十三於四。書之。
施「互質」於四於二。書之。

施「歐拉餘數」於二。書之。
施「歐拉餘數」於十二。書之。
施「歐拉餘數」於十三。書之。
施「歐拉餘數」於十六。書之。
施「歐拉餘數」於二百五十五。書之。

================================================
FILE: examples/factorial.wy
================================================
吾有一術。名之曰「階乘」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	若「甲」等於一者。
		乃得「甲」。
	若非。
		減「甲」以一。名之曰「乙」。
		施「階乘」於「乙」。名之曰「丙」。
		乘「丙」以「甲」。名之曰「丁」。
		乃得「丁」
	也。
是謂「階乘」之術也。

施「階乘」於五。書之。

================================================
FILE: examples/fibonacci.wy
================================================
吾有一術。名之曰「斐波那契」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	若「甲」等於零者乃得零也
	若「甲」等於一者乃得一也
	減「甲」以一。減「甲」以二。名之曰「乙」。曰「丙」。
	施「斐波那契」於「乙」。名之曰「丁」。
	施「斐波那契」於「丙」。名之曰「戊」。
	加「丁」以「戊」。名之曰「己」。
	乃得「己」。
是謂「斐波那契」之術也。

施「斐波那契」於十二。書之。

================================================
FILE: examples/fibonacci2.wy
================================================
吾有一術。名之曰「斐氏列」。

欲行是術。必先得一數。曰「因」。乃行是術曰。
		有數零。名之曰「頭」。
	有數一。名之曰「尾」。
		有數一。名之曰「計」。
	有數零。名之曰「果」。

	若「因」等於零者。昔之「果」者。今「因」是矣云云。
	若「因」等於一者。昔之「果」者。今「因」是矣云云。

		恆為是。若「計」不小於「因」者乃止也。
				加「頭」以「尾」。昔之「果」者。今其是矣。
				昔之「頭」者。今「尾」是矣。
				昔之「尾」者。今「果」是矣。
				加「計」以一。昔之「計」者。今其是矣。
		云云。

		乃得「果」
是謂「斐氏列」之術也。

施「斐氏列」於十。書之。


================================================
FILE: examples/fibonacci_array.wy
================================================
吾有一術。名之曰「斐氏列」。
欲行是術。必先得一數。曰「限」。乃行是術曰。
	有數零。名之曰「計」。
	吾有一列。名之曰「斐氏列」。
	為是「限」遍。
		若「計」小於二者。
			充「斐氏列」以「計」。
		若非。
			減「計」以一。名之曰「計前」。
			夫「斐氏列」之「計前」。名之曰「甲」。
			夫「斐氏列」之「計」。名之曰「乙」。
			加「甲」以「乙」。名之曰「新數」。
			充「斐氏列」以「新數」。
		云云。
		加「計」以一。昔之「計」者。今其是也。
	乃得「斐氏列」矣。
是謂「斐氏列」之術也。

施「斐氏列」於二十。書之。


================================================
FILE: examples/fizzbuzz.wy
================================================
有數一。名之曰「戊」。恆為是。

	除「戊」以三。所餘幾何。變其。名之曰「三餘」。
	除「戊」以五。所餘幾何。變其。名之曰「五餘」。

	夫「三餘」「五餘」中有陽乎。變其。名之曰「寂」。
	若「寂」者。吾有一言。曰「戊」。書之。
	若非。
		吾有一言。名之曰「聲」。
		若「三餘」者。加「聲」以「「黃河流水鳴濺濺。」」。昔之「聲」者。今其是矣。云云。
		若「五餘」者。加「聲」以「「燕山胡騎鳴啾啾。」」。昔之「聲」者。今其是矣。云云。
		吾有一言。曰「聲」。書之。
	云云。

	若「戊」等於一百者乃止也。
加一以「戊」。昔之「戊」者。今其是矣云云。

================================================
FILE: examples/hanoi.wy
================================================
吾有一術。名之曰「漢諾塔」。欲行是術。必先得四數。曰「盤數」。曰「甲塔」。曰「乙塔」。曰「丙塔」。
乃行是術曰。
	若「盤數」等於零者。吾有一列。乃得其也。
	減「盤數」以一。昔之「盤數」者。今其是矣。
	施「漢諾塔」於「盤數」。於「甲塔」。於「丙塔」。於「乙塔」。名之曰「古」。
	施「漢諾塔」於「盤數」。於「丙塔」。於「乙塔」。於「甲塔」。名之曰「後」。
	吾有一列。名之曰「步」。充「步」以「甲塔」。以「乙塔」。
	吾有一列。名之曰「今」。充「今」以「步」。
	銜「古」以「今」以「後」。名之曰「史」。乃得「史」。
是謂「漢諾塔」之術也。

吾有一術。名之曰「畫塔法」。欲行是術。必先得一數。曰「盤數」。一列。曰「史」。
乃行是術曰。
	吾有一言。曰「「甲乙丙」」。名之曰「諸名」。
	吾有一列。名之曰「三塔」。充「三塔」以「盤數」。以零。以零。

	吾有一術。名之曰「畫」。是術曰。
		有數一。名之曰「戌」。恆為是。若「戌」大於三者乃止也。
			夫「三塔」之「戌」。名之曰「碟」。
			減「盤數」以「碟」。名之曰「柱」。
			吾有一言。名之曰「行」。
			為是「碟」遍。加「行」以「「盤」」。昔之「行」者。今其是矣。云云。
			為是「柱」遍。加「行」以「「一」」。昔之「行」者。今其是矣。云云。
			夫「諸名」之「戌」。名之曰「名」。
			吾有四言。曰「「〔」」。曰「名」。曰「「〕」」。曰「行」。書之。
		加一以「戌」。昔之「戌」者。今其是矣云云。
		書之。
	是謂「畫」之術也。

	凡「史」中之「步」
		施「畫」噫。
		夫「步」之一。名之曰「起」
		夫「步」之二。名之曰「訖」
		夫「三塔」之「起」。減其以一。昔之「三塔」之「起」者。今其是矣。
		夫「三塔」之「訖」。加其以一。昔之「三塔」之「訖」者。今其是矣。
		書之。
	云云。
	施「畫」噫。
	吾有一言。曰「「畢」」。書之。
是謂「畫塔法」之術也。


有數四。名之曰「盤數」
施「漢諾塔」於「盤數」。於一。於二。於三。名之曰「史」。
施「畫塔法」於「盤數」。於「史」。

================================================
FILE: examples/hanoi_stack.wy
================================================
吾有一術。名之曰「漢諾塔」。
欲行是術。必先得四數。曰「盤數」。曰「起」。曰「過」。曰「訖」。乃行是術曰。
	吾有五言。曰「「天竺有一漢諾塔。初置」」。曰「盤數」。曰「「金盤於柱」」。曰「起」。曰「「。」」。書之。
	吾有五言。曰「「欲盡其過」」。曰「過」。曰「「移至」」。曰「訖」。曰「「。」」。書之。
	施「三柱初始」於「盤數」。於「起」。於「過」。於「訖」。
	吾有一列。名之曰「棧」。
	吾有一列。名之曰「史」。
	有數零。名之曰「步數」。
	施「新步元」於「盤數」。於「起」。於「過」。於「訖」。名之曰「外元」。
	恆為是。
		夫「棧」之長。變其。名之曰「棧空」。
		夫「外元」之「「盤數」」。變其。名之曰「外元盤零」。
		夫「外元盤零」「棧空」中無陰乎。名之曰「當止」。
		若「當止」者乃止也。
		施「鏡步元」於「外元」。名之曰「內元」。
		恆為是。
			若「內元」之「「盤數」」不大於零者乃止也。
			施「入棧」於「棧」。於「內元」。
			夫「內元」之「「盤數」」者。減其以一。昔之「內元」之「「盤數」」者。今其是矣。
			夫「內元」之「「過」」者。名之曰「臨甲」。
			昔之「內元」之「「過」」者。今「內元」之「「訖」」是矣。
			昔之「內元」之「「訖」」者。今「臨甲」是矣。
		云云。
		施「首元」於「棧」。名之曰「外元」。
		施「出棧」於「棧」。昔之「棧」者。今其是矣。
		吾有一列。名之曰「步」。
		夫「外元」之「「起」」。名之曰「步起」。
		夫「外元」之「「訖」」。名之曰「步訖」。
		充「步」以「步起」。以「步訖」。
		加「步數」以一。昔之「步數」者。今其是矣。
		施「書步」於「步數」。於「步」。
		施「三柱更新」於「步」。
		施「畫步」。
		夫「外元」之「「盤數」」者。減其以一。昔之「外元」之「「盤數」」者。今其是矣。
		夫「外元」之「「起」」者。名之曰「臨乙」。
		昔之「外元」之「「起」」者。今「外元」之「「過」」是矣。
		昔之「外元」之「「過」」者。今「臨乙」是矣。
	云云。
	吾有三言。曰「「噫。吁嚱。共步」」。曰「步數」。曰「「也。」」。書之。
	書之。
是謂「漢諾塔」之術也。

今有一物。名之曰「三柱」。其物如是。
	物之「「柱名」」者。列曰零。
	物之「「起」」者。數曰零。
	物之「「過」」者。數曰零。
	物之「「訖」」者。數曰零。
是謂「三柱」之物也。

吾有一物。名之曰「步元」。其物如是。
	物之「「盤數」」者。數曰零。
	物之「「起」」者。元曰零。
	物之「「過」」者。元曰零。
	物之「「訖」」者。元曰零。
是謂「步元」之物也。

今有一術。名之曰「三柱初始」。欲行是術。必先得四數。曰「盤數」。曰「起」。曰「過」。曰「訖」。乃行是術曰。
	夫「盤數」。昔之「三柱」之「「起」」者。今其是矣。
	吾有一列。名之曰「柱名」。
	充「柱名」以「起」。以「過」。以「訖」。
	夫「柱名」。昔之「三柱」之「「柱名」」者。今其是矣。
是謂「三柱更新」之術也。

今有一術。名之曰「三柱更新」。欲行是術。必先得一列。曰「步」。乃行是術曰。
	夫「步」之一者。名之曰「步起」。
	夫「步」之二者。名之曰「步訖」。
	夫「三柱」之「「柱名」」者。名之曰「柱名」。
	夫「柱名」之一。名之曰「起柱名」。
	夫「柱名」之二。名之曰「過柱名」。
	夫「柱名」之三。名之曰「訖柱名」。
	若「步起」等於「起柱名」者。夫「三柱」之「「起」」者。減其以一。昔之「三柱」之「「起」」者。今其是矣云云。
	若「步起」等於「過柱名」者。夫「三柱」之「「過」」者。減其以一。昔之「三柱」之「「過」」者。今其是矣云云。
	若「步起」等於「訖柱名」者。夫「三柱」之「「訖」」者。減其以一。昔之「三柱」之「「訖」」者。今其是矣云云。
	若「步訖」等於「起柱名」者。夫「三柱」之「「起」」者。加其以一。昔之「三柱」之「「起」」者。今其是矣云云。
	若「步訖」等於「過柱名」者。夫「三柱」之「「過」」者。加其以一。昔之「三柱」之「「過」」者。今其是矣云云。
	若「步訖」等於「訖柱名」者。夫「三柱」之「「訖」」者。加其以一。昔之「三柱」之「「訖」」者。今其是矣云云。
是謂「三柱更新」之術也。

吾有一術。名之曰「新步元」。欲行是術。必先得一數。曰「盤數」。三元。曰「起」。曰「過」。曰「訖」。乃行是術曰。
	吾有一物。名之曰「新元」。
	昔之「新元」之「「盤數」」者。今「盤數」矣。
	昔之「新元」之「「起」」者。今「起」矣。
	昔之「新元」之「「過」」者。今「過」矣。
	昔之「新元」之「「訖」」者。今「訖」矣。
	乃得「新元」矣。
是謂「新步元」之術也。

吾有一術。名之曰「鏡步元」。欲行是術。必先得一物。曰「步元」。乃行是術曰。
	吾有一物。名之曰「新元」。
	夫「步元」之「「盤數」」。
	昔之「新元」之「「盤數」」者。今其是矣。
	夫「步元」之「「起」」。
	昔之「新元」之「「起」」者。今其是矣。
	夫「步元」之「「過」」。
	昔之「新元」之「「過」」者。今其是矣。
	夫「步元」之「「訖」」。
	昔之「新元」之「「訖」」者。今其是矣。
	乃得「新元」矣。
是謂「鏡步元」之術也。

吾有一術。名之曰「截取」。欲行是術。必先得一列。曰「列」。二數。曰「起」。曰「止」。乃行是術曰。
	吾有一列。名之曰「新列」。
	吾有一數。曰「起」。名之曰「針」。
	恆為是。若「針」大於「止」者乃止也。
		夫「列」之「針」。充「新列」以其。
		加「針」以一。昔之「針」者。今其是也。
	乃得「新列」矣。
是謂「截取」之術也。

吾有一術。名之曰「入棧」。欲行是術。必先得一列。曰「棧」。一元。曰「元」。乃行是術曰。
	吾有一列。曰「棧」。名之曰「新棧」。
	施「鏡步元」於「元」。名之曰「新元」。
	充「新棧」以「新元」。
	乃得「新棧」矣。
是謂「入棧」之術也。

吾有一術。名之曰「首元」。欲行是術。必先得一列。曰「棧」。乃行是術曰。
	夫「棧」之長。名之曰「尾」。
	夫「棧」之「尾」。名之曰「出元」。
	乃得「出元」矣。
是謂「首元」之術也。

吾有一術。名之曰「出棧」。欲行是術。必先得一列。曰「棧」。乃行是術曰。
	夫「棧」之長。名之曰「尾」。
	減「尾」以一。昔之「尾」者。今其是矣。
	施「截取」於「棧」。於一。於「尾」。乃得其矣。
是謂「出棧」之術也。

吾有一術。名之曰「書步」。
欲行是術。必先得一數。曰「步數」。一列。曰「步」。乃行是術曰。
	夫「步」之一者。名之曰「步起」。
	夫「步」之二者。名之曰「步訖」。
	吾有七言。曰「「步」」。曰「步數」。曰「「。自」」。曰「步起」。
		曰「「移至」」。曰「步訖」。曰「「。」」。書之。
是謂「書步」之術也。

吾有一術。名之曰「畫步」。是術曰。
	夫「三柱」之「「柱名」」者。名之曰「柱名」。
	夫「三柱」之「「起」」者。名之曰「盤」。
	減「盤數」以「盤」。名之曰「柱」。
	夫「柱名」之一。名之曰「起柱名」。
	銜「「【」」以「起柱名」。以「「】」」。名之曰「行」。
	為是「盤」遍。加「行」以「「〇」」。昔之「行」者。今其是矣。云云。
	為是「柱」遍。加「行」以「「一」」。昔之「行」者。今其是矣。云云。
	夫「行」者。書之。
	夫「三柱」之「「過」」者。名之曰「盤」。
	減「盤數」以「盤」。名之曰「柱」。
	夫「柱名」之二。名之曰「過柱名」。
	銜「「【」」以「過柱名」。以「「】」」。名之曰「行」。
	為是「盤」遍。加「行」以「「〇」」。昔之「行」者。今其是矣。云云。
	為是「柱」遍。加「行」以「「一」」。昔之「行」者。今其是矣。云云。
	夫「行」者。書之。
	夫「三柱」之「「訖」」者。名之曰「盤」。
	減「盤數」以「盤」。名之曰「柱」。
	夫「柱名」之三。名之曰「訖柱名」。
	銜「「【」」以「訖柱名」。以「「】」」。名之曰「行」。
	為是「盤」遍。加「行」以「「〇」」。昔之「行」者。今其是矣。云云。
	為是「柱」遍。加「行」以「「一」」。昔之「行」者。今其是矣。云云。
	夫「行」者。書之。
	書之。
是謂「畫步」之術也。

有數三。名之曰「盤數」。
施「漢諾塔」於「盤數」。於「「甲」」。於「「乙」」。於「「丙」」。


================================================
FILE: examples/helloworld+.wy
================================================
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
	吾有一言。曰「「問天地好在。」」。書之。
云云。

================================================
FILE: examples/helloworld.wy
================================================
吾有一言。曰「「問天地好在。」」。書之。

================================================
FILE: examples/import.wy
================================================
吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」「圓周率」「取底」「取整」「取頂」「正負」「絕對」之義。
吾嘗觀「「曆法」」之書。方悟「言今之日時」之義。
吾嘗觀「「易經」」之書。方悟「占」之義。
吾嘗觀「「helloworld」」之書。

施「言今之日時」。書之。

施「餘弦」於「圓周率」。書之。

施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。
施「占」。書之。

施「取底」於「圓周率」。書之。
施「取整」於「圓周率」。書之。
施「取頂」於「圓周率」。書之。
施「絕對」於「圓周率」。書之。
施「正負」於「圓周率」。書之。


================================================
FILE: examples/linglong_tower.wy
================================================
吾有一言。曰「「繞口令  玲瓏塔」」。書之。

吾有一術。名之曰「數玲瓏塔」。
欲行是術。必先得一數。曰「層」。乃行是術曰。

	若「層」等於三者。
    	吾有一言。曰「「玲瓏塔。塔玲瓏。接過了二層數 三 層。」」。書之。
    若非。若「層」等於一十三者。
    	吾有一言。曰「「玲瓏塔。塔玲瓏。到了尖兒的 一十三 層。」」。書之。
    若非。
		吾有三言。曰「「玲瓏塔。塔玲瓏。玲瓏寶塔第」」。曰「層」。曰「「層。」」。書之。
    云云。云云。
	
	乘「層」以四。名之曰「四倍之」。
    
    若「層」等於二者。
    	吾有三言。曰「「兩 张高桌」」。曰「四倍之」。曰「「條腿。兩 個和尚 兩 本經。」」。書之。
        
        吾有一言。曰「「兩 副铙钹 兩 口磬。兩 個木了魚子 兩 盞燈。」」。書之。
        
        吾有四言。曰「「兩 個金玲整」」。曰「四倍之」。曰「「兩。風兒一刮響嘩楞。」」。書之乃得矣。
    若非。
    	吾有八言。曰「層」。曰「「张高桌」」。曰「四倍之」。曰「「條腿。」」。
    		曰「層」。曰「「個和尚」」。曰「層」。曰「「本經。」」。書之。
	
		吾有八言。曰「層」。曰「「副铙钹」」。曰「層」。曰「「口磬。」」。
    		曰「層」。曰「「個木了魚子」」。曰「層」。曰「「盞燈。」」。書之。
    云云。
	
	若「四倍之」不大於九者。
    	吾有四言。曰「層」。曰「「個金玲整」」。曰「四倍之」。曰「「兩。風兒一刮響嘩楞。」」。書之乃得矣。
    若非。
    	吾有四言。曰「層」。曰「「個金玲」」。曰「四倍之」。曰「「兩。風兒一刮響嘩楞。」」。書之乃得矣。
    云云。

是謂「數玲瓏塔」之術也。

有數一十又三。名之曰「最高層」。

有數一。名之曰「層」。

恆為是。若「層」大於「最高層」者乃止也。

	施「數玲瓏塔」於「層」。
    	
加「層」以二。昔之「層」者。今其是矣云云。

吾有一言。曰「「玲瓏寶塔往回數。」」。書之。

減「層」以三。昔之「層」者。今其是矣。

恆為是。若「層」小於二者乃止也。

	施「數玲瓏塔」於「層」。
    
減「層」以二。昔之「層」者。今其是矣云云。


================================================
FILE: examples/macro.wy
================================================
或云「「書「甲」焉」」。
蓋謂「「吾有一言。曰「甲」。書之」」。

書「「問天地好在」」焉。

注曰「「書「「問天地好在」」焉。」」
疏曰「「凡居「「」」與『』中之宏。不予展開」」

吾嘗觀「「列經」」之書。方悟「遍施」「篩剔」「左併」之義。


吾有一術。名之曰「加一」。欲行是術。必先得一數曰「甲」。是術曰。
	加一於「甲」。乃得矣。
是謂「加一」之術也。

吾有一術。名之曰「比三」。欲行是術。必先得一數曰「甲」。是術曰。
	若「甲」大於三者乃得陽。若非乃得陰也。
是謂「比三」之術也。

吾有一術。名之曰「相加」。欲行是術。必先得二數曰「甲」曰「乙」。是術曰。
	加「甲」以「乙」。乃得矣。
是謂「相加」之術也。


吾有一列。名之曰「某列」。充「某列」以一以二以三以四以五以六。


施「遍施」於「加一」於「某列」。書之。

凡「某列」皆「加一」其上者。書之。


施「篩剔」於「比三」於「某列」。書之。

唯「某列」中得「比三」者。書之。


施「左併」於「相加」於零於「某列」。書之。

併「某列」於零以「相加」者。書之。


施「左併」於「相加」於零。名之曰「求和」。

施「求和」於「某列」。書之。

================================================
FILE: examples/mandelbrot.wy
================================================
吾有一術。名之曰「曼德博」。欲行是術。必先得二數。曰「寬」。曰「高」。乃行是術曰。
	批曰。「「曼德博集。亦稱曼德布洛特复数集合。复平面上组成分形之点之集合也。」」

	吾有一言。曰「「丁龘蠹臺龜畫龍淼蔑高五三二」」。名之曰「皴法」。
	批曰。「「皴法者。圖畫之法也」」。

	減零以一。名之曰「上」。加零以一。名之曰「下」。
	減零以二。名之曰「左」。加零以二。名之曰「右」。

	減「右」以「左」。除其以「寬」。名之曰「橫步」。
	減「下」以「上」。除其以「高」。名之曰「縱步」。

	有數零。名之曰「戊」。恆為是。若「戊」等於「高」者乃止也。

		乘「縱步」以「戊」。加其以「上」。以名之曰「虛」。

		吾有一言。名之曰「行」。

		有數零。名之曰「戌」。恆為是。若「戌」等於「寬」者乃止也。

			乘「橫步」以「戌」。加其以「左」。名之曰「實」。

			夫「虛」。名之曰「虛虛」。
			夫「實」。名之曰「實實」。

			批曰。「「凡每一像素。皆算令其收斂之最大疊代數」」。

			有數零。名之曰「己」。恆為是。若「己」等於十二者乃止也。

				乘「實實」以「實實」。乘「虛虛」以「虛虛」。名之曰「甲」。曰「乙」。
				加「甲」以「乙」。名之曰「丙」。
				若「丙」大於四者乃止也。

				乘「虛虛」以「實實」。乘其以二。加其以「虛」。昔之「虛虛」者。今其是矣。
				減「甲」以「乙」。加其以「實」。昔之「實實」者。今其是矣。

			加一以「己」。昔之「己」者。今其是矣云云。

			批曰。「「既得疊代數。乃以皴法圖之」」。

			減十三以「己」。名之曰「巳」。
			夫「皴法」之「巳」。名之曰「墨」。
			加「行」以「墨」。昔之「行」者。今其是矣。

		加一以「戌」。昔之「戌」者。今其是矣云云。

		吾有一言。曰「行」。書之。
	加一以「戊」。昔之「戊」者。今其是矣云云。
是謂「曼德博」之術也。

批曰。「「畫曼德博集合之法。至是盡矣。乃一試之」」。

施「曼德博」於五十九。於二十四。



================================================
FILE: examples/mergesort.wy
================================================
吾有一術。名之曰「歸併」。欲行是術。必先得二列。曰「甲」。曰「乙」。
乃行是術曰。
	若「甲」之長等於零者。乃得「乙」也。
	若「乙」之長等於零者。乃得「甲」也。

	吾有二數。曰一。曰一。名之曰「甲引」。曰「乙引」。
	吾有一列。名之曰「果」。
	恆為是。
		若「甲」之長小於「甲引」者。乃止也。
		若「乙」之長小於「乙引」者。乃止也。
		夫「甲」之「甲引」。名之曰「甲一」。
		夫「乙」之「乙引」。名之曰「乙一」。
		若「甲一」不大於「乙一」者。
			充「果」以「甲一」。
			加「甲引」以一。名之曰「甲引」。
		若非。
			充「果」以「乙一」。
			加「乙引」以一。名之曰「乙引」。
		也。
	云云。

	若「甲」之長小於「甲引」者。
		恆為是。
			若「乙」之長小於「乙引」者。乃止也。
			夫「乙」之「乙引」。名之曰「乙餘」。
			充「果」以「乙餘」。
			加「乙引」以一。名之曰「乙引」。
		云云。
		乃得「果」
	也。
	若「乙」之長小於「乙引」者。
		恆為是。
			若「甲」之長小於「甲引」者。乃止也。
			夫「甲」之「甲引」。名之曰「甲餘」。
			充「果」以「甲餘」。
			加「甲引」以一。名之曰「甲引」。
		云云。
		乃得「果」
	也。
是謂「歸併」之術也。

吾有一術。名之曰「並排」。欲行是術。必先得一列。曰「甲」。
乃行是術曰。
	若「甲」之長不大於一者。乃得「甲」也。
	夫「甲」之長。名之曰「甲長」。
	除「甲長」以二。所餘幾何。名之曰「甲餘」。
	減「甲長」以「甲餘」。除其以二。名之曰「甲中」。
	吾有二列。名之曰「甲前」。曰「甲後」。
	吾有一數。曰一。名之曰「甲引」。
	恆為是。
		若「甲引」大於「甲」之長者。乃止也。
		夫「甲」之「甲引」。名之曰「甲一」。
		若「甲引」不大於「甲中」者。
			充「甲前」以「甲一」。
		若非。
			充「甲後」以「甲一」。
		也。
		加「甲引」以一。名之曰「甲引」。
	云云。
	施「並排」於「甲前」。昔之「甲前」者。今其是矣。
	施「並排」於「甲後」。昔之「甲後」者。今其是矣。
	施「歸併」於「甲前」。於「甲後」。名之曰「果」。
	乃得「果」。
是謂「並排」之術也。

吾有一列。名之曰「測排」。充「測排」以一。以三。以二。以十八。以十四。
施「並排」於「測排」。書之。


================================================
FILE: examples/misc.wy
================================================
吾有一言。曰「「問天地好在。」」。書之。
有數三十。名之曰「甲」。
吾有三言。曰「「甲之數」」。曰「甲」。曰「「也」」。書之。

批曰。「「文氣淋灕。字句切實」」。

吾有二爻。曰陽。曰陰。名之曰「天」。曰「地」。
夫「天」「地」中無陰乎。夫「天」「地」中有陽乎。噫。
變「天」。名之曰「人」。

減「甲」以一。加「甲」以二。名之曰「乙」。曰「丙」。

吾有一列。名之曰「丁」。
充「丁」以一。以二。以三。以四。

有數一。名之曰「戊」。
恆為是。
	若「戊」等於「甲」者。
		乃止
	也。
	吾有一言。曰「戊」。書之。
	加一以「戊」。昔之「戊」者。今其是矣。
云云。

吾有一術。名之曰「階乘」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	若「甲」等於一者。
		乃得「甲」。
	若非。
		減「甲」以一。名之曰「乙」。
		施「階乘」於「乙」。名之曰「丙」。
		乘「丙」以「甲」。名之曰「丁」。
		乃得「丁」
	也。
是謂「階乘」之術也。

吾有一術。名之曰「異或」。欲行是術。必先得二爻。曰「甲」。曰「乙」。乃行是術曰。
	若「甲」等於「乙」者。
		乃得陰。
	若非。
		乃得陽
	也。
是謂「異或」之術也。

吾有一術。名之曰「快排」。欲行是術。必先得一列。曰「甲」。乃行是術曰。
	若「甲」之長不大於一者。
		乃得「甲」
	也。
	吾有三列。名之曰「首」。曰「頷」。曰「尾」。

	夫「甲」之一。名之曰「甲一」。
	充「頷」以「甲一」。
	夫「甲」之其餘。名之曰「甲餘」。

	凡「甲餘」中之「丁」。
		若「丁」小於「甲一」者。
			充「首」以「丁」。
		若非。
			充「尾」以「丁」
		也。
	云云。
	施「快排」於「首」。昔之「首」者。今其是矣。
	施「快排」於「尾」。昔之「尾」者。今其是矣。

	銜「首」以「頷」以「尾」。名之曰「乙」。
	乃得「乙」。

是謂「快排」之術也。

吾有一列。名之曰「己」。
充「己」以五。以三。以二十。以八。以三十五。以七百。
施「快排」於「己」。書之。


================================================
FILE: examples/modinv.wy
================================================
吾有一術。名之曰「大衍求一」。欲行是術。必先得二數。曰「奇」。曰「定」。乃行是術曰。
注曰「「
	大衍求一術云。
	置奇右上。定居右下。立天元一於左上。
	先以右上除右下。所得商數與左上一相生。入左下。然後乃以右行上下。
	以少除多。遞互除之。所得商數隨即遞互累乘。歸左行上下。
	須使右上末後奇一而止。乃驗左上所得。以為乘率。
	或奇數已見單一者。便為乘率。
」」
	若「奇」等於〇者。乃得〇也。
	若「奇」等於一者。乃得一也。

	有數一。名之曰「天元」。
	吾有四數。曰「奇」曰「定」曰「天元」曰〇。
		名之曰「右上」曰「右下」曰「左上」曰「左下」。

	恆為是。
		若「右上」等於一者。乃得「左上」也。

		除「右下」以「右上」。所餘幾何。名之曰「餘數」。
		減「右下」以「餘數」。除其以「右上」。名之曰「商數」。
		乘「商數」以「左上」。加「左下」以其。昔之「左下」者。今其是矣。
		昔之「右下」者。今「餘數」是矣。

		若「右下」等於〇者。乃得〇也。
		注曰。「「若右下等於〇者。曰奇數與定數不互素。無乘率也。」」

		減「右上」以一,除其以「右下」。所餘幾何。加其以一。名之曰「餘數」。
		減「右上」以「餘數」。除其以「右下」。名之曰「商數」。
		乘「商數」以「左下」。加「左上」以其。昔之「左上」者。今其是矣。
		昔之「右上」者。今「餘數」是矣。
	云云。
是謂「大衍求一」之術也。


施「大衍求一」於四十九。於十四萬二千八百五十七。名之曰「乘率」。
乘四十九以「乘率」。除其以十四萬二千八百五十七。所餘幾何。書之。


================================================
FILE: examples/multiplication_table.wy
================================================
吾有一術名之曰「乘算口訣」。是術曰。
	有數一名之曰「甲」。
	恆為是。若「甲」不小於十者乃止也。
		有數一名之曰「乙」。
		加「甲」以「乙」名之曰「丙」。
		恆為是。若「乙」不小於「丙」者乃止也。
				乘「甲」以「乙」名之曰「果」。
				若「果」不小於十者吾有三言。曰「乙」曰「甲」曰「果」書之。
				若非吾有四言。曰「乙」曰「甲」曰「「得」」曰「果」書之也。
				加「乙」以一。昔之「乙」者今其是矣。
		云云。
		加「甲」以一。昔之「甲」者今其是矣。
	云云。
是謂「乘算口訣」之術也。
施「乘算口訣」。


================================================
FILE: examples/nested_fun.wy
================================================
有數三。名之曰「甲」。
有數四。名之曰「乙」。
有數五。名之曰「丙」。
吾有一列。名之曰「癸」。充「癸」以一以二以三。

吾有一術。名之曰「丁」。欲行是術。必先得三數。曰「寅」曰「卯」曰「辰」乃行是術曰。
	乃得一。
是謂「丁」之術也。

吾有一術。名之曰「戊」。欲行是術。必先得二數。曰「寅」曰「卯」乃行是術曰。
	乃得二。
是謂「戊」之術也。

吾有一術。名之曰「己」。欲行是術。必先得一數。曰「寅」乃行是術曰。
	乃得三。
是謂「己」之術也。

注曰「「庚 = 戊(甲,乙)」」
夫「甲」。夫「乙」。取二以施「戊」。名之曰「庚」。

注曰「「子 = 戊(甲+乙,丙)」」
加「甲」以「乙」。夫「丙」。取二以施「戊」。名之曰「子」。

注曰「「丑 = 戊(癸[3],癸.length)」」
夫「癸」之三。夫「癸」之長。取二以施「戊」。名之曰「丑」。

注曰「「辛 = 戊(甲,戊(乙,丙))」」
夫「甲」。夫「乙」。夫「丙」。取二以施「戊」。取二以施「戊」。名之曰「辛」。

注曰「「壬 = 丁(己(戊(甲,戊(乙,丙))),甲,乙)」」
夫「甲」。夫「乙」。夫「丙」。取二以施「戊」。取二以施「戊」。取一以施「己」。夫「甲」。夫「乙」。取三以施「丁」。名之曰「壬」。

================================================
FILE: examples/obj.wy
================================================
吾有一物。名之曰「精衛」。其物如是。
	物之「「名」」者。言曰「「女娃」」。
	物之「「足數」」者。數曰二。
	物之「「喙數」」者。數曰一。
是謂「精衛」之物也。

吾有一術。名之曰「造物之術」。欲行是術。必先得一言。曰「甲」。乃行是術曰。
	吾有一物。名之曰「乙」。其物如是。
		物之「「丙」」者。言曰「甲」。
		物之「「丁」」者。數曰四。
	是謂「乙」之物也。
	乃得「乙」。
是謂「造物之術」之術也。

施「造物之術」於「「某甲」」。名之曰「戊」。
昔之「戊」之「「丁」」者。今五是矣。
施「JSON.stringify」於「戊」。書之。
昔之「戊」之「「丁」」者。今不復存矣。
施「JSON.stringify」於「戊」。書之。

================================================
FILE: examples/pascal_triangle.wy
================================================
吾有一術。名之曰「賈憲三角」。欲行是術。必先得一數。曰「層數」。乃行是術曰。
	吾有一列。名之曰「前層之得」。
	充「前層之得」以一。夫「前層之得」。書之。
	若「層數」等於一者乃歸空無也。

	充「前層之得」以一。夫「前層之得」。書之。
	若「層數」等於二者乃歸空無也。

	有數三。名之曰「計甲」。
	恆為是。若「計甲」大於「層數」者乃止也。
		吾有一列。名之曰「此層之得」。
		充「此層之得」以一。
		有數一。名之曰「計乙」。
		夫「前層之得」之長。名之曰「層長」。
		恆為是。若「計乙」不小於「層長」者乃止也
			加一以「計乙」。名之曰「計乙又一」
			夫「前層之得」之「計乙」。名之曰「數甲」。
			夫「前層之得」之「計乙又一」。名之曰「數乙」。
			加「數甲」以「數乙」。名之曰「新數」。
			充「此層之得」以「新數」。
			加「計乙」以一。昔之「計乙」者。今其是矣。
		云云。
		充「此層之得」以一。夫「此層之得」。書之。
		昔之「前層之得」者。今「此層之得」是矣。
		加「計甲」以一。昔之「計甲」者。今其是矣。
	云云
是謂「賈憲三角」之術也。

施「賈憲三角」於九。


================================================
FILE: examples/pi_leibniz.wy
================================================
吾有一術。名之曰「萊布尼茲圓周率估算」。
欲行是術。必先得一數。
曰「頂」。
乃行是術曰。
	吾有三數。名之曰「埃」曰「積」曰「畸」。
	有數一。名之曰「符」。
	恆為是。
		若「埃」大於「頂」者,乃止也。
		乘二於「埃」,名之曰「畸」。
	加一於「畸」,名之曰「畸」。
	除「符」以「畸」,名之曰「畸」。
	乘四於「畸」,名之曰「畸」。
		加「畸」於「積」,名之曰「積」。
		乘負一於「符」,名之曰「符」。
		加一於「埃」,名之曰「埃」。
	云云。
	乃得「積」。
是謂「萊布尼茲圓周率估算」之術也。

施「萊布尼茲圓周率估算」於十。書之。
施「萊布尼茲圓周率估算」於六十九。書之。
施「萊布尼茲圓周率估算」於四百二十。書之。
施「萊布尼茲圓周率估算」於一千三百三十七。書之。
施「萊布尼茲圓周率估算」於十一萬四千五百一十四。書之。

================================================
FILE: examples/pi_liuhui.wy
================================================
注曰「「割圓術始載於劉徽所著九章算術注」」

吾嘗觀「「算經」」之書。方悟「冪」「平方根」之義。

吾有一數。曰一。名之曰「半徑」。
乘「半徑」以「半徑」。名之曰「半徑平方」。

吾有一術。名之曰「求小弦」。欲行是術。必先得二數。曰「裏觚之面」。曰「輪數」。乃行是術曰。
	若「輪數」小於一者。乃得「裏觚之面」也。
	除「裏觚之面」以二。名之曰「半面」。
	乘「半面」以「半面」。名之曰「半面平方」。
	減「半徑平方」以「半面平方」。取一以施「平方根」。名之曰「股」。
	減「半徑」以「股」。名之曰「小句」。
	乘「小句」以「小句」。加其以「半面平方」。取一以施「平方根」。名之曰「小弦」。
	夫「小弦」。減「輪數」以一。取二以施「求小弦」。乃得矣。
是謂「求小弦」之術也。

注曰「「輪數始於一」」
吾有一術。名之曰「割圓術求圓率」。欲行是術。必先得一數曰「輪數」。乃行是術曰。
	減「輪數」以一。昔之「輪數」者。今其是矣。
	施「冪」於二於「輪數」。乘其以六。名之曰「觚數」。
	施「求小弦」於「半徑」於「輪數」。名之曰「小弦」。
	乘「小弦」以「觚數」。名之曰「觚周」。
	除「觚周」以二。乘其以「半徑」。名之曰「觚冪」。
	除「觚冪」以「半徑平方」。名之曰「圓率」。
	夫「「割圓」」。夫「觚數」。夫「「觚。所得圓率者。」」。書之。
	夫「圓率」。夫「「也。」」。書之。
	乃得「圓率」。
是謂「割圓術求圓率」之術也。

施「割圓術求圓率」於十。


================================================
FILE: examples/quicksort.wy
================================================
吾有一術。名之曰「快排」。欲行是術。必先得一列。曰「甲」。乃行是術曰。
	若「甲」之長不大於一者。
		乃得「甲」
	也。
	吾有三列。名之曰「首」。曰「頷」。曰「尾」。

	夫「甲」之一。名之曰「甲一」。
	充「頷」以「甲一」。
	夫「甲」之其餘。名之曰「甲餘」。

	凡「甲餘」中之「丁」。
		若「丁」小於「甲一」者。
			充「首」以「丁」。
		若非。
			充「尾」以「丁」
		也。
	云云。
	施「快排」於「首」。昔之「首」者。今其是矣。
	施「快排」於「尾」。昔之「尾」者。今其是矣。

	銜「首」以「頷」以「尾」。名之曰「乙」。
	乃得「乙」。

是謂「快排」之術也。

吾有一列。名之曰「己」。
充「己」以五。以三。以二十。以八。以三十五。以七百。
施「快排」於「己」。書之。

================================================
FILE: examples/quicksort_inplace.wy
================================================
吾有一術。名之曰「降龍十八掌」。欲行是術。必先得二數。曰「少陽」。曰「老陽」。一列。曰「陰」。
是術曰。
	若「少陽」不小於「老陽」者。
		乃得陰。
	也。
	吾有一數。名之曰「太極」。
	施「一陽指」於「少陽」。於「老陽」。於「陰」。昔之「太極」者。今其是矣。
	減一於「太極」。名之曰「少陰」。
	加一以「太極」。名之曰「老陰」。
	施「降龍十八掌」於「少陽」。於「少陰」。於「陰」。
	施「降龍十八掌」於「老陰」。於「老陽」。於「陰」。
	乃得陽。
是謂「降龍十八掌」之術也。


吾有一術。名之曰「一陽指」。欲行是術。必先得二數。曰「少陽」。曰「老陽」。一列。曰「陰」。
是術曰。
	吾有一數。曰「少陽」。名之曰「乾」。
	吾有一數。曰「少陽」。名之曰「坤」。
	恆為是。若「乾」不小於「老陽」者乃止也。
		若「陰」之「乾」小於「陰」之「老陽」者。
			施「乾坤大挪移」於「坤」。於「乾」。於「陰」。
			加一以「坤」。昔之「坤」者。今其是矣。
		也。
		加一以「乾」。昔之「乾」者。今其是矣。
	云云。

	批曰。「「若再施乾坤大挪移。则走火入魔。何故。是行便宜之法以达同之功。」」。
		夫「陰」之「老陽」。名之曰「陰乾」。
	夫「陰」之「坤」。名之曰「陰坤」。
	昔之「陰」之「乾」者。今「陰坤」是矣。
	昔之「陰」之「坤」者。今「陰乾」是矣。
	乃得「坤」。
是謂「一陽指」之術也。


吾有一術。名之曰「乾坤大挪移」。欲行是術。必先得二數。曰「乾」。曰「坤」。一列。曰「陰」。
是術曰。
	夫「陰」之「乾」。名之曰「陰乾」。
	夫「陰」之「坤」。名之曰「陰坤」。
	昔之「陰」之「乾」者。今「陰坤」是矣。
	昔之「陰」之「坤」者。今「陰乾」是矣。
是謂「乾坤大挪移」之術也。


有數一。名之曰「少陽」。
吾有一列。名之曰「陰」。充「陰」以四。以二。以五。以三。以一。
夫「陰」之長。名之曰「老陽」。
施「降龍十八掌」於「少陽」。於「老陽」。於「陰」。
吾有一列。曰「陰」。名之曰「陽」。
吾有一言。曰「陽」。書之。


================================================
FILE: examples/quine.wy
================================================
注曰Reference: 注曰https://qiita.com/amoO_O/items/5d0c4edfc99f64bea6fb
吾有一術。名之曰「自己複製」。欲行是術。是術曰。吾有一術。名之曰「置換」。欲行是術。必先得三數。曰「文字列」。曰「置換対象」。曰「置換先」是術曰。吾有一言。曰「「」」。名之曰「返品」。吾有一數。曰二。名之曰「未来」。吾有一爻。曰陽。名之曰「実行条件」。凡「文字列」中之「文字」。若「実行条件」者。若「文字」等於「「星」」中無陰乎「文字列」之「未来」等於「置換対象」者。昔之「文字」者。今「置換先」是。昔之「実行条件」者。今陰是。也。加「返品」以「文字」。昔之「返品」者。今其是矣。若非。昔之「実行条件」者。今陽是。也。加「未来」以一。昔之「未来」者。今其是矣。云云。乃得「返品」。是謂「置換」之術也。吾有一言。曰String.fromCharCode名之曰「函数」。施「函数」於一萬二千三百。昔之「始」者。今其是矣。施「函数」於一萬二千三百零一。昔之「終」者。今其是矣。吾有二言。曰「「吾有一術。名之曰星甲自己複製星乙。欲行是術。是術曰。吾有一術。名之曰星甲置換星乙。欲行是術。必先得三數。曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。吾有一數。曰二。名之曰星甲未来星乙。吾有一爻。曰陽。名之曰星甲実行条件星乙。凡星甲文字列星乙中之星甲文字星乙。若星甲実行条件星乙者。若星甲文字星乙等於星甲星甲星星乙星乙中無陰乎星甲文字列星乙之星甲未来星乙等於星甲置換対象星乙者。昔之星甲文字星乙者。今星甲置換先星乙是。昔之星甲実行条件星乙者。今陰是。也。加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。若非。昔之星甲実行条件星乙者。今陽是。也。加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。云云。乃得星甲返品星乙。是謂星甲置換星乙之術也。吾有一言。曰String.fromCharCode名之曰星甲函数星乙。施星甲函数星乙於一萬二千三百。昔之星甲始星乙者。今其是矣。施星甲函数星乙於一萬二千三百零一。昔之星甲終星乙者。今其是矣。吾有二言。曰星甲星甲星丙星乙星乙。曰星甲星甲星乙星乙。名之曰星甲原文星乙曰星甲結果星乙。施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始星乙。昔之星甲結果星乙者。今其是矣。施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終星乙。昔之星甲結果星乙者。今其是矣。施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。吾有一言。曰星甲結果星乙。書之。是謂星甲自己複製星乙之術也。施星甲自己複製星乙。」」。曰「「」」。名之曰「原文」曰「結果」。施「置換」於「原文」。於「「甲」」。於「始」。昔之「結果」者。今其是矣。施「置換」於「結果」。於「「乙」」。於「終」。昔之「結果」者。今其是矣。施「置換」於「結果」。於「「丙」」。於「原文」。昔之「結果」者。今其是矣。吾有一言。曰「結果」。書之。是謂「自己複製」之術也。施「自己複製」。

================================================
FILE: examples/quine2.wy
================================================
注曰Reference: 注曰https://qiita.com/amoO_O/items/5d0c4edfc99f64bea6fb
吾有一術。名之曰「自己複製」。
欲行是術。是術曰。

吾有一術。名之曰「置換」。
欲行是術。必先得三數。
曰「文字列」。曰「置換対象」。曰「置換先」是術曰。
	吾有一言。曰「「」」。名之曰「返品」。
	吾有一數。曰二。名之曰「未来」。
	吾有一數。曰陽。名之曰「実行条件」。
	凡「文字列」中之「文字」。
		若「実行条件」者。
			若「文字」等於「「星」」」中無陰乎「文字列」之「未来」等於「置換対象」者。
				加「返品」以「置換先」。昔之「返品」者。今其是矣。
				昔之「実行条件」者。今陰是。
			若非。
				加「返品」以「文字」。昔之「返品」者。今其是矣。
			也。
		若非。
			昔之「実行条件」者。今陽是。
		也。
		加「未来」以一。昔之「未来」者。今其是矣。
	云云。
	乃得「返品」。
是謂「置換」之術也。

吾有一言。曰String.fromCharCode名之曰「函数」。
施「函数」於一萬二千三百。昔之「始括弧」者。今其是矣。
施「函数」於一萬二千三百零一。昔之「終括弧」者。今其是矣。
施「函数」於三十二。昔之「空白」者。今其是矣。
加「空白」以「空白」。昔之「空白」者。今其是矣。
施「函数」於十。昔之「改行」者。今其是矣。
吾有一言。曰「「吾有一術。名之曰星甲自己複製星乙。星丁欲行是術。是術曰。星丁星丁吾有一術。名之曰星甲置換星乙。星丁欲行是術。必先得三數。星丁曰星甲文字列星乙。曰星甲置換対象星乙。曰星甲置換先星乙是術曰。星丁星丙吾有一言。曰星甲星甲星乙星乙。名之曰星甲返品星乙。星丁星丙吾有一數。曰二。名之曰星甲未来星乙。星丁星丙吾有一數。曰陽。名之曰星甲実行条件星乙。星丁星丙凡星甲文字列星乙中之星甲文字星乙。星丁星丙星丙星丙若星甲実行条件星乙者。星丁星丙星丙星丙星丙若星甲文字星乙等於星甲星甲星星乙星乙星乙中無陰乎星甲文字列星乙之未来等於星甲置換対象星乙者。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲置換先星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙星丙昔之星甲実行条件星乙者。今陰是。星丁星丙星丙星丙星丙若非。星丁星丙星丙星丙星丙星丙加星甲返品星乙以星甲文字星乙。昔之星甲返品星乙者。今其是矣。星丁星丙星丙星丙星丙也。星丁星丙星丙星丙若非。星丁星丙星丙星丙星丙昔之星甲実行条件星乙者。今陽是。星丁星丙星丙星丙也。星丁星丙星丙加星甲未来星乙以一。昔之星甲未来星乙者。今其是矣。星丁星丙云云。星丁星丙乃得星甲返品星乙。星丁是謂星甲置換星乙之術也。星丁星丁吾有一言。曰String.fromCharCode名之曰星甲函数星乙。星丁施星甲函数星乙於一萬二千三百。昔之星甲始括弧星乙者。今其是矣。星丁施星甲函数星乙於一萬二千三百零一。昔之星甲終括弧星乙者。今其是矣。星丁施星甲函数星乙於三十二。昔之星甲空白星乙者。今其是矣。星丁加星甲空白星乙以星甲空白星乙。昔之星甲空白星乙者。今其是矣。星丁施星甲函数星乙於十。昔之星甲改行星乙者。今其是矣。星丁吾有一言。曰星甲星甲星戊星乙星乙。名之曰星甲原文星乙。星丁吾有一言。曰星甲星甲星乙星乙。名之曰星甲結果星乙。星丁施星甲置換星乙於星甲原文星乙。於星甲星甲甲星乙星乙。於星甲始括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲乙星乙星乙。於星甲終括弧星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丙星乙星乙。於星甲空白星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲丁星乙星乙。於星甲改行星乙。昔之星甲結果星乙者。今其是矣。星丁施星甲置換星乙於星甲結果星乙。於星甲星甲戊星乙星乙。於星甲原文星乙。昔之星甲結果星乙者。今其是矣。星丁吾有一言。曰星甲結果星乙。書之。星丁星丁是謂星甲自己複製星乙之術也。星丁施星甲自己複製星乙。」」。名之曰「原文」。
吾有一言。曰「「」」。名之曰「結果」。
施「置換」於「原文」。於「「甲」」。於「始括弧」。昔之「結果」者。今其是矣。
施「置換」於「結果」。於「「乙」」。於「終括弧」。昔之「結果」者。今其是矣。
施「置換」於「結果」。於「「丙」」。於「空白」。昔之「結果」者。今其是矣。
施「置換」於「結果」。於「「丁」」。於「改行」。昔之「結果」者。今其是矣。
施「置換」於「結果」。於「「戊」」。於「原文」。昔之「結果」者。今其是矣。
吾有一言。曰「結果」。書之。

是謂「自己複製」之術也。
施「自己複製」。

================================================
FILE: examples/selectionsort.wy
================================================
吾有一術。名之曰「擇排」。欲行是術。必先得一列。曰「數列」。乃行是術曰。
	吾有一列。名之曰「答列」。
	夫「數列」之長。名之曰「度」。
	為是「度」遍。
		夫「數列」之一。名之曰「若者」。
		吾有一數。曰一。名之曰「若者之位」。
		吾有一數。曰一。名之曰「位」。
		凡「數列」中之「員」。
			若「員」小於「若者」者。
				昔之「若者」者。今「員」是矣。
				昔之「若者之位」者。今「位」是矣。
			也。
			加一於「位」。名之曰「位」。

		云云。
		充「答列」以「若者」。

		吾有一列。名之曰「數列新世」。
		吾有一數。曰一。名之曰「新位」。
		凡「數列」中之「員」。
			若「新位」小於「若者之位」者。
				充「數列新世」以「員」。
			也。
			若「新位」大於「若者之位」者。
				充「數列新世」以「員」。
			也。
			加一於「新位」。名之曰「新位」。

		云云。
		昔之「數列」者。今「數列新世」是矣。

	云云。

	乃得「答列」。
是謂「擇排」之術也。


吾有一列。名之曰「測排」。
充「測排」以八。以千。以十。以五。以五十五。以三百。以九。
施「擇排」於「測排」。書之。


================================================
FILE: examples/serialization.wy
================================================
吾嘗觀「「渾沌經」」之書。方悟「包渾沌」「食渾沌」之義。

吾有一言。曰「「\
	物\
		之「名」言「李白」\
		之「字」言「太白」\
		之「號」言「青蓮」\
		之「壽考」數「六一」\
		之「生年」言「長安元年」\
		之「卒年」言「上元三年」\
		之「存詩」數「九〇〇」\
		之「擅詩」爻「陽」\
		之「官」物\
			之「銜」言「翰林」。\
			之「年」言「天寶元年」。\
		也\
		之「名句」列\
			物\
				之「題」言「清平調」\
				之「文」言「雲想衣裳花相容。春風拂檻露華濃。」\
			也\
			物\
				之「題」言「長相思」\
				之「文」言「長相思。在長安。絡緯秋啼金井闌。微霜淒淒簟色寒。」\
			也\
			物\
				之「題」言「襄陽歌」\
				之「文」言「落日欲沒峴山西。倒著接蘺花下迷。襄陽小兒齊拍手。攔街爭唱「白銅鞮」。」\
			也\
			物\
				之「題」言「楊叛兒」\
				之「文」言「烏啼隱楊花。君醉留妾家。博山爐中沉香火。雙煙一氣凌紫霞。」\
			也\
		也\
		之「子女」列\
			言「伯禽」言「平陽」言「頗黎」\
		也\
	也\
」」。名之曰「李翰林」。


施「食渾沌」於「李翰林」。名之曰「太白餛飩」。
施「JSON.stringify」於「太白餛飩」。書之。
施「包渾沌」於「太白餛飩」。書之。


================================================
FILE: examples/sieve.wy
================================================
吾有一術。名之曰「埃氏篩」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	吾有一列。名之曰「掩」。為是「甲」遍。充「掩」以陽也。
	除「甲」以二。名之曰「甲半」。

	有數二。名之曰「戊」。恆為是。若「戊」不小於「甲半」者乃止也。
		有數二。名之曰「戌」。恆為是。若「戌」不小於「甲半」者乃止也。

			乘「戊」以「戌」。名之曰「合」
			若「合」不大於「甲」者。
				昔之「掩」之「合」者。今陰是矣。
			若非乃止也。
		加一以「戌」。昔之「戌」者。今其是矣云云。
	加一以「戊」。昔之「戊」者。今其是矣云云。

	吾有一列。名之曰「諸素」。
	昔之「戊」者。今二是矣。恆為是。若「戊」等於「掩」之長者乃止也。
		夫「掩」之「戊」。名之曰「素耶」。
		若「素耶」者充「諸素」以「戊」也。
	加一以「戊」。昔之「戊」者。今其是矣云云。
	乃得「諸素」。
是謂「埃氏篩」之術也。

施「埃氏篩」於一百。書之。

================================================
FILE: examples/sqrt_newton.wy
================================================
吾有一術。名之曰「牛頓求根法」。
欲行是術。必先得一數。
曰「試」。
乃行是術曰。
		有數一。名之曰「甲」。
	有數一。名之曰「乙」。
	為是「試」遍。
		乘「甲」於「甲」,名之曰「乙」。減「乙」以二,名之曰「乙」
		乘二於「甲」,名之曰「丙」。
		除「乙」以「丙」,名之曰「茂」。
		減「甲」以「茂」,名之曰「甲」。
	云云。
	乃得「甲」。
是謂「牛頓求根法」之術也。

施「牛頓求根法」於二。書之。
施「牛頓求根法」於三。書之。
施「牛頓求根法」於五。書之。
施「牛頓求根法」於七。書之。
施「牛頓求根法」於十三。書之。
施「牛頓求根法」於一百三十一。書之。
施「牛頓求根法」於一千零一十三。書之。

================================================
FILE: examples/tree.wy
================================================
吾嘗觀「「畫譜」」之書。方悟「備紙」「擇筆」「蘸色」「落筆」「運筆」「提筆」「裱畫」之義。
吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」「半圓周率」之義。

吾有一術。名之曰「畫樹法」。欲行是術。必先得一物。曰「紙」。
五數。曰「東」曰「南」曰「長」曰「粗」曰「向」。是術曰。

	施「餘弦」於「向」。乘其以「長」。加其以「東」。名之曰「末東」
	施「正弦」於「向」。乘其以「長」。減其於「南」。名之曰「末南」

	施「擇筆」於「紙」於「粗」。

	施「落筆」於「紙」於「東」於「南」。
	施「運筆」於「紙」於「末東」於「末南」。
	施「提筆」於「紙」。

	加「向」以零又三分。名之曰「左向」。
	減「向」以零又三分。名之曰「右向」。
	乘「長」以零又八分。名之曰「枝長」。
	乘「粗」以零又八分。名之曰「枝粗」。

	若「枝長」小於五者。乃歸空無也。

	施「畫樹法」於「紙」。於「末東」。於「末南」。於「枝長」。於「枝粗」。於「左向」。
	施「畫樹法」於「紙」。於「末東」。於「末南」。於「枝長」。於「枝粗」。於「右向」。

是謂「畫樹法」之術也。


施「備紙」於二百五十六。於二百五十六。名之曰「紙」。
施「蘸色」於「紙」於「「黑」」。
施「畫樹法」於「紙」。於一百二十八。於二百五十六。於五十。於五。於「半圓周率」。
施「裱畫」於「紙」於「「out」」

================================================
FILE: examples/tree2.wy
================================================
吾嘗觀「「畫譜」」之書。方悟「備紙」「擇筆」「蘸色」「落筆」「運筆」「提筆」「裱畫」之義。
吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」「半圓周率」「四分圓周率」之義。
吾嘗觀「「易經」」之書。方悟「運」「占」之義。

施「運」於十六。

吾有一術。名之曰「畫樹法」。欲行是術。必先得一物。曰「紙」。
六數。曰「東」曰「南」曰「長」曰「粗」曰「向」曰「向變」。是術曰。

	施「餘弦」於「向」。乘其以「長」。加其以「東」。名之曰「末東」
	施「正弦」於「向」。乘其以「長」。減其於「南」。名之曰「末南」

	減「末南」以二。名之曰「雪上」。
	減「南」以二。名之曰「雪下」。

	施「擇筆」於「紙」於「粗」。
	施「蘸色」於「紙」於「「鈦白」」。
	施「落筆」於「紙」於「東」於「雪下」。
	施「運筆」於「紙」於「末東」於「雪上」。
	施「提筆」於「紙」。

	施「擇筆」於「紙」於「粗」。
	施「蘸色」於「紙」於「「黑」」。
	施「落筆」於「紙」於「東」於「南」。
	施「運筆」於「紙」於「末東」於「末南」。
	施「提筆」於「紙」。

	加「向」以零又三分。乘其以零又五分。加其以「四分圓周率」。名之曰「左向」。
	減「向」以零又三分。乘其以零又五分。加其以「四分圓周率」。名之曰「右向」。
	施「占」。減其以零又五分。乘其以「向變」。名之曰「左歪」。
	施「占」。減其以零又五分。乘其以「向變」。名之曰「右倒」。
	加「左向」以「左歪」。昔之「左向」者。今其是矣。
	加「右向」以「右倒」。昔之「右向」者。今其是矣。

	施「占」。乘其以二。加其以三。除其以五。乘其於「長」。名之曰「左枝長」。
	施「占」。乘其以二。加其以三。除其以五。乘其於「長」。名之曰「右枝長」。
	乘「粗」以零又八分。名之曰「枝粗」。
	乘「向變」以零又九分。名之曰「枝向變」。

	有爻陰。名之曰「著花」。
	若「枝粗」小於一者。
		施「占」。若其小於零又三分者。昔之「著花」者。今陽是矣。云云。
	若非。
		施「占」。若其小於零又二分者。昔之「著花」者。今陽是矣。云云。
	云云。

	施「占」。若「著花」者
		減「末南」以二。名之曰「苞」。
		施「占」。乘其以四。加其以三。名之曰「瓣」
		施「擇筆」於「紙」於「瓣」。
		施「蘸色」於「紙」於「「曙紅」」。
		施「落筆」於「紙」於「末東」於「末南」。
		施「運筆」於「紙」於「末東」於「苞」。
		施「提筆」於「紙」。
	云云

	若「枝粗」小於一又二分者。乃歸空無也。

	施「畫樹法」於「紙」於「末東」於「末南」於「左枝長」於「枝粗」於「左向」於「枝向變」。
	施「畫樹法」於「紙」於「末東」於「末南」於「右枝長」於「枝粗」於「右向」於「枝向變」。

是謂「畫樹法」之術也。


吾有一術。名之曰「畫地法」。欲行是術。必先得一物。曰「紙」。
五數。曰「左」曰「右」曰「底」曰「高」曰「步」。是術曰。

	施「擇筆」於「紙」於「高」。
	施「蘸色」於「紙」於「「鈦白」」。
	施「落筆」於「紙」於「左」於「底」。

	有數一。名之曰「戊」。恆為是。若「戊」大於「右」者乃止也。
		施「占」。乘其以「高」。減其於「底」。名之曰「厚」
		施「運筆」於「紙」於「戊」於「厚」。
	加「戊」以「步」。昔之「戊」者。今其是矣。云云。

	施「運筆」於「紙」於「右」於「底」。
	施「提筆」於「紙」。


是謂「畫地法」之術也。

施「備紙」於五百十二。於二百五十六。名之曰「紙」。

施「畫樹法」於「紙」於一百八十於二百五十六於五十於十於一於三。
施「畫樹法」於「紙」於三百三十二於二百五十六於五十於十於一於三。

施「畫地法」於「紙」於零於五百十二於二百六十於十於五十。


施「裱畫」於「紙」於「「out」」

================================================
FILE: examples/try.wy
================================================

姑妄行此。
	嗚呼。「「滅頂」」之禍。

如事不諧。豈「「虛指」」之禍歟。
	吾有一言。曰「「本無此物。奈何用之」」。書之。

豈「「文法」」之禍歟。
	吾有一言。曰「「不合文法。不通之甚」」。書之。

豈「「異類」」之禍歟。
	吾有一言。曰「「物各其類。豈可混同」」。書之。

豈「「滅頂」」之禍歟。
	吾有一言。曰「「嗚呼哀哉。伏维尚飨」」。書之。

不知何禍歟。名之曰「奇禍」。
	吾有一言。曰「「人坐家中。禍從天降」」。書之。

乃作罷。


姑妄行此。
	嗚呼。「「無足輕重」」之禍。
如事不諧乃作罷。


姑妄行此。
	嗚呼。「「事不關心」」之禍。曰「「事不關心。關心者亂」」

如事不諧。不知何禍歟。名之曰「禍」。夫「禍」之「「名」」。書之。乃作罷。

================================================
FILE: examples/turing.wy
================================================
吾有一術。名之曰「圖靈機」。欲行是術。必先得一列。曰「諸律」。二言。曰「始態」。曰「終態」。
乃行是術曰。
	吾有一列。名之曰「帶」。充「帶」以「「白」」。
	有數一。名之曰「針」。

	吾有二數。曰一。曰一。名之曰「左疆」。曰「右疆」。
	吾有一言。曰「始態」。名之曰「態」。

	吾有一術。名之曰「圖靈機畫法」。是術曰。
		吾有一言。名之曰「畫帶」。
		有數「左疆」。名之曰「筆」。恆為是。若「筆」大於「右疆」者乃止也。
			夫「帶」之「筆」。名之曰「符」。
			若「針」等於「筆」者。
				加「符」於「「〔」」。加其以「「〕」」昔之「符」者。今其是矣
			若非。
				加「符」於「「、」」。加其以「「、」」昔之「符」者。今其是矣
			云云。
			加「畫帶」以「符」。昔之「畫帶」者。今其是矣。

		加一以「筆」。昔之「筆」者。今其是矣云云。
		吾有四言。曰「態」。曰「「《」」。曰「畫帶」。曰「「》」」書之。
	是謂「圖靈機畫法」之術也。

	施「圖靈機畫法」。噫。

	恆為是。
		凡「諸律」中之「律」
			夫「律」之一。名之曰「甲態」。
			夫「律」之二。名之曰「讀符」。
			夫「律」之三。名之曰「乙態」。
			夫「律」之四。名之曰「畫符」。
			夫「律」之五。名之曰「移」。

			若「態」等於「甲態」者。若「帶」之「針」等於「讀符」者。
				昔之「帶」之「針」者。今「畫符」是矣。
				昔之「態」者。今「乙態」是矣。
				若「移」等於「「左」」者。減一於「針」。昔之「針」者。今其是矣。云云。
				若「移」等於「「右」」者。加一於「針」。昔之「針」者。今其是矣。云云。
				乃止。
			云云云云
		云云。

		若「針」小於「左疆」者。
			昔之「帶」之「針」者。今「「白」」是矣。
			昔之「左疆」者。今「針」是矣。
		云云
		若「針」大於「右疆」者。
			昔之「帶」之「針」者。今「「白」」是矣。
			昔之「右疆」者。今「針」是矣。
		云云

		施「圖靈機畫法」。噫。
		若「態」等於「終態」者乃止也。
	云云。
是謂「圖靈機」之術也。


吾有一術。名之曰「製律」。欲行是術。必先得一列。曰「諸律」。
	五言。曰「甲態」。曰「讀符」。曰「乙態」。曰「畫符」。曰「移」。乃行是術曰。
	吾有一列。名之曰「律」。
	充「律」以「甲態」。以「讀符」。以「乙態」。以「畫符」。以「移」。
	充「諸律」以「律」。
是謂「製律」之術也。

吾有一言。曰「「營營河狸。止于樊。」」。書之。

吾有一列。名之曰「諸律」。
吾有一言。曰「「墨」」。名之曰「陽符」。
吾有一言。曰「「白」」。名之曰「陰符」。
施「製律」於「諸律」於「「甲」」於「陰符」於「「乙」」於「陽符」於「「右」」
施「製律」於「諸律」於「「甲」」於「陽符」於「「丙」」於「陽符」於「「左」」
施「製律」於「諸律」於「「乙」」於「陰符」於「「甲」」於「陽符」於「「左」」
施「製律」於「諸律」於「「乙」」於「陽符」於「「乙」」於「陽符」於「「右」」
施「製律」於「諸律」於「「丙」」於「陰符」於「「乙」」於「陽符」於「「左」」
施「製律」於「諸律」於「「丙」」於「陽符」於「「樊」」於「陽符」於「「中」」

施「圖靈機」於「諸律」於「「甲」」於「「樊」」。




================================================
FILE: examples/zh_sqrt.wy
================================================
吾嘗觀『算經』之書。方悟「取底除」之義。

吾有一術。名之曰「增乘開平方」。欲行是術。必先得一數。曰「實」。乃行是術曰。
	注曰。『增乘開平方法,以商數乘下法遞增求之。』。
	吾有四數。名之曰「果」曰「商」曰「餘」曰「廉」。有數一。名之曰「法」。
	恆為是。施「取底除」於「實」於「法」。若其之『商』小於百者乃止也。
		乘「法」以百。昔之「法」者。今其是矣云云。
	恆為是。若「法」不大於零者乃止也。
		乘「果」以十。昔之「果」者。今其是矣。
		加「廉」以「商」。乘其以十。昔之「廉」者。今其是矣。
		施「取底除」於「實」於「法」。名之曰「甲」。
		昔之「實」者。今「甲」之『商』是矣。
		昔之「餘」者。今「甲」之『餘』是矣。
		昔之「商」者。今零是矣。
		恆為是。加「廉」以「商」。乘其以「商」。若其不小於「實」者乃止也。
			加「商」以一。昔之「商」者。今其是矣云云。
		加「廉」以「商」。乘其以「商」。若其大於「實」者。
			減「商」以一。昔之「商」者。今其是矣云云。
		加「廉」以「商」。昔之「廉」者。今其是矣。
		加「果」以「商」。昔之「果」者。今其是矣。
		乘「商」以「廉」。減「實」以其。乘其以「法」。加其以「餘」。昔之「實」者。今其是矣。
		施「取底除」於「法」於百。昔之「法」者。今其之『商』是矣云云。
		注曰。『商第一位。上商得數以乘下法為乘方。命上商除實。上商得數以乘下法入乘方。一退為廉,下法再退。』。
		注曰。『商第二位。商得數以乘下法為隅。命上商除實訖。以上商乘下法入隅,皆名曰廉。一退,下法再退,以求第三位商。』。
		注曰。『商第三位。用法如第二位求之。』。
	乃得 「果」。
是謂「增乘開平方」之術也。

噫。施「增乘開平方」於七萬一千八百二十四。書之。
注曰。『楊輝算草』。


================================================
FILE: jest.config.js
================================================
module.exports = {
  roots: [
    '<rootDir>/test',
  ],
  testMatch: [
    '**/__tests__/**/*.+(ts|tsx|js)',
    '**/?(*.)+(spec|test).+(ts|tsx|js)',
  ],
  transform: {
    '^.+\\.(ts|tsx)$': 'ts-jest',
  },
  globalSetup: './test/setup.js',
}


================================================
FILE: lib/js/位經.wy
================================================
疏曰「「左移。同犀之x<<y也。」」
今有一術。名之曰「左移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(x<<y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「左移」之術也。

疏曰「「右移。同犀之x>>y也。」」
今有一術。名之曰「右移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(x>>y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「右移」之術也。

疏曰「「補零右移。同犀之x>>>y也。」」
今有一術。名之曰「補零右移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(x>>>y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「補零右移」之術也。

疏曰「「位與。同犀之x&y也。」」
今有一術。名之曰「位與」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(x&y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「位与」之術也。

疏曰「「位或。同犀之x|y也。」」
今有一術。名之曰「位或」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(x|y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「位或」之術也。

疏曰「「異或。同犀之x^y也。」」
今有一術。名之曰「異或」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(x^y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「异或」之術也。

疏曰「「與非。同犀之~(x&y)也。」」
今有一術。名之曰「與非」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(x=>y=>(~(x&y)))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「与非」之術也。

疏曰「「位變。同犀之~x也。」」
今有一術。名之曰「位變」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「(x=>(~x))」於「甲」。名之曰「乙」。乃得「乙」。
是謂「位變」之術也。


================================================
FILE: lib/js/天地經.wy
================================================
今有一言。曰「「犀」」。名之曰「境」。

注曰「「鑒。同Javascript之eval也。」」
今有一術。名之曰「鑒」。欲行是術。必先得一言。曰「言」。乃行是術曰。
	施「eval」於「言」。乃得矣。
是謂「鑒」之術也。

================================================
FILE: lib/js/格物.wy
================================================

今有一術。名之曰「取物」。欲行是術。必先得一物曰「物」。一言曰「端」。乃行是術曰。
	施「(obj=>x=>obj[x])」於「物」於「端」。乃得矣。
是謂「取物」之術也。

今有一術。名之曰「置物」。欲行是術。必先得一物曰「物」。一言曰「端」。一元曰「實」。乃行是術曰。
	施「(obj=>x=>v=>{obj[x]=v})」於「物」於「端」於「實」。
是謂「置物」之術也。

今有一術。名之曰「列物之端」。欲行是術。必先得一物曰「物」。乃行是術曰。
	施「Object.keys」於「物」乃得矣。
是謂「列物之端」之術也。

今有一術。名之曰「識類」。欲行是術。必先得一元曰「元」。乃行是術曰。
	施「(x=>((x instanceof Array)?"列":({"number":"數","boolean":"爻","string":"言","function":"術","object":"物"}[(typeof x)])))」於「元」乃得矣。
是謂「識類」之術也。


================================================
FILE: lib/js/畫譜.wy
================================================
吾有一列。名之曰「色表」。充「色表」
以「「黑」」。	以「「#000000」」。
以「「鈦白」」。	以「「#ffffff」」。
以「「藤黃」」。	以「「#faea56」」。
以「「硃磦」」。	以「「#d44906」」。
以「「硃砂」」。	以「「#c0927b」」。
以「「胭脂」」。	以「「#491817」」。
以「「曙紅」」。	以「「#c72c35」」。
以「「赭石」」。	以「「#522d14」」。
以「「大紅」」。	以「「#b91c1b」」。
以「「花青」」。	以「「#141931」」。
以「「三綠」」。	以「「#afceb5」」。
以「「酞青藍」」。	以「「#1e2867」」。
以「「三青」」。	以「「#acc8d4」」。


今有一術。名之曰「備紙」。欲行是術。必先得二數。曰「寬」。曰「高」。乃行是術曰。
	施「document.createElement」於「「canvas」」。名之曰「canv」。
	施「canv.getContext」於「「2d」」。名之曰「ctx」。
	昔之「canv」之「「width」」者。今「寬」是矣。
	昔之「canv」之「「height」」者。今「高」是矣。
	昔之「ctx.lineJoin」者。今「「round」」是矣。
	昔之「ctx.lineCap」者。今「「round」」是矣。
	乃得「canv」。
是謂「備紙」之術也。

今有一術。名之曰「裱畫」。欲行是術。必先得一物。曰「紙」。一言。曰「壁」。乃行是術曰。
	施「document.getElementById」於「壁」。名之曰「div」。
	施「div.appendChild」於「紙」。
是謂「裱畫」之術也。


今有一術。名之曰「落筆」。欲行是術。必先得一物。曰「紙」。二數。曰「東」曰「南」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	施「ctx.beginPath」。
	施「(x=>y=>ctx.moveTo(x,y))」於「東」於「南」。
是謂「落筆」之術也。

今有一術。名之曰「運筆」。欲行是術。必先得一物。曰「紙」。二數。曰「東」曰「南」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	施「(x=>y=>ctx.lineTo(x,y))」於「東」於「南」。
是謂「運筆」之術也。

吾有一術。名之曰「取十六進制色」。欲行是術。必先得一言。曰「色」。乃行是術曰。
	有數一。名之曰「戊」。恆為是。若「戊」大於「色表」之長者乃止也。
		若「色表」之「戊」等於「色」者。
			加「戊」以一。名之曰「色數」。
			夫「色表」之「色數」。乃得矣。
			乃止。
		云云。
	加二以「戊」。昔之「戊」者。今其是矣。云云。
是謂「取十六進制色」之術也。

今有一術。名之曰「蘸色」。欲行是術。必先得一物。曰「紙」。一言。曰「色」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	昔之「ctx.globalAlpha」者。今一是矣。
	
	施「取十六進制色」於「色」。名之曰「十六進制色」。
	昔之「ctx.strokeStyle」者。今「十六進制色」是矣。
	昔之「ctx.fillStyle」者。今「十六進制色」是矣。
是謂「蘸色」之術也。

今有一術。名之曰「調色」。欲行是術。必先得一物曰「紙」。一言曰「色」。一數曰「分」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	昔之「ctx.globalAlpha」者。今一是矣。
	
	施「取十六進制色」於「色」。名之曰「col」。
	夫「分」。名之曰「t」。
	
	夫「parseInt(ctx.fillStyle.slice(1),16)」。名之曰「rgb0」。
	夫「parseInt(col.slice(1),16)」。名之曰「rgb1」
	夫「Math.floor((rgb0>>>16)*(1-t)+(rgb1>>>16)*t)」名之曰「r」
	夫「Math.floor(((rgb0>>8)&0xff)*(1-t)+((rgb1>>8)&0xff)*t)」名之曰「g」
	夫「Math.floor((rgb0&0xff)*(1-t)+(rgb1&0xff)*t)」名之曰「b」
	夫「r.toString(16).padStart(2,'0')」名之曰「R」。
	夫「g.toString(16).padStart(2,'0')」名之曰「G」。
	夫「b.toString(16).padStart(2,'0')」名之曰「B」。
	夫「"#"+R+G+B」。名之曰「十六進制色」。
	昔之「ctx.strokeStyle」者。今「十六進制色」是矣。
	昔之「ctx.fillStyle」者。今「十六進制色」是矣。

是謂「調色」之術也。

今有一術。名之曰「蘸水」。欲行是術。必先得一物曰「紙」。一數曰「分」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	減「分」於一。昔之「ctx.globalAlpha」者。今其是矣。
是謂「蘸水」之術也。

今有一術。名之曰「擇筆」。欲行是術。必先得一物。曰「紙」。一數。曰「號」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	昔之「ctx.lineWidth」者。今「號」是矣。
是謂「擇筆」之術也。

今有一術。名之曰「提筆」。欲行是術。必先得一物。曰「紙」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	施「ctx.stroke」。
是謂「提筆」之術也。

今有一術。名之曰「設色」。欲行是術。必先得一物。曰「紙」。乃行是術曰。
	有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
	施「ctx.fill」。
是謂「設色」之術也。

================================================
FILE: lib/js/西曆法.wy
================================================
今有一術。名之曰「紀元時」。是術曰。
	施「(()=>new Date().getTime()/1000)」。乃得矣。
是謂「紀元時」之術也。

今有一術。名之曰「時差」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「(x => 0 - new Date(x * 1000).getTimezoneOffset() * 60)」於「時」。乃得矣。
是謂「時差」之術也。


================================================
FILE: lib/py/位經.wy
================================================
今有一術。名之曰「左移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	吾有一術。名之曰
	施「(lambda x: lambda y : x<<y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「左移」之術也。

今有一術。名之曰「右移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(lambda x: lambda y : x>>y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「右移」之術也。

今有一術。名之曰「補零右移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(lambda x: lambda y : return (x % 0x100000000) >> y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「補零右移」之術也。

今有一術。名之曰「位与」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(lambda x: lambda y : x&y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「位与」之術也。

今有一術。名之曰「位或」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(lambda x: lambda y : x|y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「位或」之術也。

今有一術。名之曰「异或」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(lambda x: lambda y : x^y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「异或」之術也。

今有一術。名之曰「与非」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	施「(lambda x: lambda y : ~(x&y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。
是謂「与非」之術也。

今有一術。名之曰「位變」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「(lambda x: ~x」於「甲」。名之曰「乙」。乃得「乙」。
是謂「位變」之術也。


================================================
FILE: lib/py/天地經.wy
================================================
今有一言。曰「「蟒」」。名之曰「境」。

今有一術。名之曰「鑒」。欲行是術。必先得一言。曰「言」。乃行是術曰。
	施「eval」於「言」。乃得矣。
是謂「鑒」之術也。

================================================
FILE: lib/py/西曆法.wy
================================================

今有一術。名之曰「紀元時」。是術曰。
	施「__import__」於「「time」」。名之曰「time」。
	施「time.time」。乃得矣。
是謂「紀元時」之術也。

今有一術。名之曰「時差」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「__import__」於「「time」」。名之曰「time」。
	施「(lambda x: time.localtime(x).tm_gmtoff)」於「時」。乃得矣。
是謂「時差」之術也。


================================================
FILE: lib/rb/天地經.wy
================================================
今有一言。曰「「鑽」」。名之曰「境」。

今有一術。名之曰「鑒」。欲行是術。必先得一言。曰「言」。乃行是術曰。
	施「eval」於「言」。乃得矣。
是謂「鑒」之術也。

================================================
FILE: lib/列經.wy
================================================
或云「「凡「甲」皆「乙」其上者」」。
蓋謂「「施「遍施」於「乙」於「甲」」」

或云「「唯「甲」中得「乙」者」」
蓋謂「「施「篩剔」於「乙」於「甲」」」

或云「「併「甲」於「乙」以「丙」者」」
蓋謂「「施「左併」於「丙」於「乙」於「甲」」」

注曰「「遍施。同Javascript之Array.forEach也。」」
今有一術。名之曰「遍施」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。
	吾有一列。名之曰「丙」。
	凡「乙」中之「丁」。
		施「甲」於「丁」。充「丙」以其也。
	乃得「丙」。
是謂「遍施」之術也。

注曰「「篩剔。同Javascript之Array.filter也。」」
今有一術。名之曰「篩剔」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。
	吾有一列。名之曰「丙」。
	凡「乙」中之「丁」。
		施「甲」於「丁」。
		若其者。充「丙」以「丁」也。
	云云。
	乃得「丙」。
是謂「篩剔」之術也。

今有一術。名之曰「左併」。欲行是術。必先得一術。曰「甲」。一元。曰「乙」。一列。曰「丙」。乃行是術曰。
	吾有一元曰「乙」。名之曰「丁」。
	凡「丙」中之「戊」。
		施「甲」於「丁」於「戊」。
		昔之「丁」者。今其是矣。
	云云。
	乃得「丁」。
是謂「左併」之術也。


今有一術。名之曰「右併」。欲行是術。必先得一術。曰「甲」。一元。曰「乙」。一列。曰「丙」。乃行是術曰。
	吾有一元曰「乙」。名之曰「丁」。
	夫「丙」之長。名之曰「戊」。
	恆為是。若「戊」小於一者乃止也。
		夫「丙」之「戊」。夫「丁」。取二以施「甲」。
		昔之「丁」者。今其是矣。
	減「戊」以一。昔之「戊」者。今其是矣。云云。
	乃得「丁」。
是謂「右併」之術也。

注曰「「排序。同Javascript之Array.sort也。」」
今有一術。名之曰「排序」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。

	若「乙」之長不大於一者。乃得「乙」也。
	吾有三列。名之曰「首」。曰「頷」。曰「尾」。

	夫「乙」之一。名之曰「乙一」。
	充「頷」以「乙一」。
	夫「乙」之其餘。名之曰「乙餘」。

	凡「乙餘」中之「丁」。
		施「甲」於「丁」於「乙一」。
		若其小於零者。
			充「首」以「丁」。
		若非。
			充「尾」以「丁」
		也。
	云云。
	施「排序」於「甲」於「首」。昔之「首」者。今其是矣。
	施「排序」於「甲」於「尾」。昔之「尾」者。今其是矣。

	銜「首」以「頷」以「尾」。名之曰「丙」。
	乃得「丙」。

是謂「排序」之術也。

注曰「「倒序。同Javascript之Array.reverse也。」」
今有一術。名之曰「倒序」。欲行是術。必先得一列。曰「甲」。乃行是術曰。
	吾有一列。名之曰「乙」。
	夫「甲」之長。名之曰「戊」。
	恆為是。若「戊」小於一者乃止也。
		夫「甲」之「戊」。充「乙」以其。
	減「戊」以一。昔之「戊」者。今其是矣。云云。
	乃得「乙」。
是謂「倒序」之術也。

注曰「「擷取。同Javascript之Array.slice也。」」
今有一術。名之曰「擷取」。欲行是術。必先得一列。曰「甲」。二數。曰「乙」曰「丙」。乃行是術曰。
	吾有一列。名之曰「丁」。
	吾有一數。曰「乙」。名之曰「戊」。
	若「丙」小於零者。夫「甲」之長。加其以「丙」。昔之「丙」者。今其是矣。云云。

	恆為是。若「戊」大於「丙」者乃止也。
		夫「甲」之「戊」。充「丁」以其。
	加「戊」以一。昔之「戊」者。今其是矣。云云。
	乃得「丁」。
是謂「擷取」之術也。


今有一術。名之曰「製列」。欲行是術。必先得一數。曰「甲」。一術。曰「乙」。一列。曰「丙」。乃行是術曰。
	吾有一列。名之曰「丁」。
	吾有一數曰一。名之曰「戊」。

	恆為是。若「戊」大於「甲」者乃止也。
		施「乙」於「戊」。充「丁」以其。
	加「戊」以一。昔之「戊」者。今其是矣。云云。
	乃得「丁」。
是謂「製列」之術也。


今有一術。名之曰「索一」。欲行是術。必先得一列。曰「甲」。一元。曰「乙」。乃行是術曰。
	吾有一數曰一。名之曰「戊」。
	恆為是。若「戊」大於「甲」之長者乃止也。
		若「乙」等於「甲」之「戊」者。乃得「戊」也。
	加「戊」以一。昔之「戊」者。今其是矣。云云。
	乃得零。
是謂「索一」之術也。





================================================
FILE: lib/易經.wy
================================================
吾有一數。曰四十二。名之曰「運數」。

注曰「「運。同Javascript之set random seed也。」」
今有一術。名之曰「運」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	注曰「「運者。隨機種子也」」
	昔之「運數」者。今「甲」是矣。
是謂「運」之術也。

注曰「「占。同Javascript之Math.random也。」」
今有一術。名之曰「占」。是術曰。
	注曰「「線性同餘方法所得隨機數也」」
	有數四十二億九千四百九十六萬七千二百九十六。名之曰「模」。
	注曰「「有數二千二百六十九萬五千四百七十七。名之曰「倍」。」」
	有數二千二百六十七萬五千四百五十六。名之曰「上倍」。有數二萬零二十一。名之曰「下倍」。
	有數一。名之曰「增」。
	乘「上倍」於「運數」。除其以「模」。所餘幾何。名之曰「上餘」。
	乘「下倍」於「運數」。加其於「上餘」。加其以「增」。除其以「模」。所餘幾何。昔之「運數」者。今其是矣。
	除「運數」以「模」。名之曰「卦」。
	乃得「卦」。
是謂「占」之術也。


================================================
FILE: lib/曆法.wy
================================================
吾嘗觀「「西曆法」」之書。方悟「紀元時」「時差」之義。
吾嘗觀「「曆表」」之書。方悟「始曆月」「曆月表」「始閏月」「閏月表」之義。
吾嘗觀「「算經」」之書。方悟「取底除」「取整除」「取底」「取頂」「取整」之義。

注曰「「今之年月日時刻者。當以紀元時(Unix timestamp)推算之。」」
疏曰「「格林威治平時西曆一九七〇年一月一日木曜日〇時即西元一九六九年己酉年十一月二十四日辛巳日子正起所積秒數也。」」
疏曰「「日八萬六千四百秒。」」

注曰「「今何紀元時。同Javascript之Date.now() / 1000也。」」
今有一術。名之曰「今何紀元時」。是術曰。
	施「紀元時」。乃得矣。
是謂「今何紀元時」之術也。

注曰「「言今之日時。同Javascript之new Date().toString(), in Chinese calendar也。」」
今有一術。名之曰「言今之日時」。是術曰。
	施「紀元時」。取一以施「言彼之日時」。乃得矣。
是謂「言今之日時」之術也。

注曰「「言今之年月日。同Javascript之new Date().toDateString(), in Chinese calendar也。」」
今有一術。名之曰「言今之年月日」。是術曰。
	施「紀元時」。取一以施「言彼之年月日」。乃得矣。
是謂「言今之年月日」之術也。

注曰「「言今之時刻。同Javascript之new Date().toTimeString(), in Chinese calendar也。」」
今有一術。名之曰「言今之時刻」。是術曰。
	施「紀元時」。取一以施「言彼之時刻」。乃得矣。
是謂「言今之時刻」之術也。

注曰「「今年何年號。同Javascript之"西元" for modern dates也。」」
今有一術。名之曰「今年何年號」。是術曰。
	施「紀元時」。取一以施「彼年何年號」。乃得矣。
是謂「今年何年號」之術也。

注曰「「今年何年。同Javascript之new Date().getFullYear() for modern dates, in Chinese calendar也。」」
今有一術。名之曰「今年何年」。是術曰。
	注曰「「年者。或以西元。或以帝王年號紀之。」」
	施「紀元時」。取一以施「彼年何年」。乃得矣。
是謂「今年何年」之術也。

注曰「「今年何干支。同Javascript之Get index (1 to 60) of this year in the 60-year cycle也。」」
今有一術。名之曰「今年何干支」。是術曰。
	注曰「「甲子得一。乙丑得二。乃至癸亥得六十也。」」
	施「紀元時」。取一以施「彼年何干支」。乃得矣。
是謂「今年何干支」之術也。

注曰「「今年積何年。同Javascript之new Date().getFullYear() + 2697, in Chinese calendar也。」」
今有一術。名之曰「今年積何年」。是術曰。
	注曰「「米制公約訂立年積四千五百七十二年。」」
	注曰「「紀元年積四千六百六十六年。」」
	施「紀元時」。取一以施「彼年積何年」。乃得矣。
是謂「今年積何年」之術也。

注曰「「今月何月。同Javascript之new Date().getMonth() + 1, N + 0.5 for leap months, in Chinese calendar也。」」
今有一術。名之曰「今月何月」。是術曰。
	注曰「「月者。正月至臘月也。」」
	注曰「「正月得一。二月得二。乃至十二月得十二也。閏月者。加半於前月數。」」
	施「紀元時」。取一以施「彼月何月」。乃得矣。
是謂「今月何月」之術也。

注曰「「今月積何月。同Javascript之Get continuously counting month number of this month也。」」
今有一術。名之曰「今月積何月」。是術曰。
	注曰「「米制公約訂立月積五萬六千五百五十一月。」」
	注曰「「紀元月積五萬七千七百二十一月。」」
	施「紀元時」。取一以施「彼月積何月」。乃得矣。
是謂「今月積何月」之術也。

注曰「「今日何日。同Javascript之new Date().getDate(), in Chinese calendar也。」」
今有一術。名之曰「今日何日」。是術曰。
	批曰「「古有越人歌。曰。今日何日兮,得與王子同舟。」」
	注曰「「初一日得一。初二日得二。乃至三十日得三十也。」」
	施「紀元時」。取一以施「彼日何日」。乃得矣。
是謂「今日何日」之術也。

注曰「「今日何干支。同Javascript之Get index (1 to 60) of today in the 60-day cycle也。」」
今有一術。名之曰「今日何干支」。是術曰。
	注曰「「甲子得一。乙丑得二。乃至癸亥得六十也。」」
	施「紀元時」。取一以施「彼日何干支」。乃得矣。
是謂「今日何干支」之術也。

注曰「「今日積何日。同Javascript之Get continuously counting day number of today也。」」
今有一術。名之曰「今日積何日」。是術曰。
	注曰「「米制公約訂立日積一百六十六萬九千九百九十九日。」」
	注曰「「紀元日積一百七十〇萬四千五百五十八日。」」
	施「紀元時」。取一以施「彼日積何日」。乃得矣。
是謂「今日積何日」之術也。

注曰「「今時何時。同Javascript之Get index (1 to 12) of current time in the 12 divisions of day也。」」
今有一術。名之曰「今時何時」。是術曰。
	注曰「「時者。子丑寅卯辰巳午未申酉戌亥。」」
	注曰「「子時得一。丑時得二。乃至亥時得十二也。」」
	施「紀元時」。取一以施「彼時何時」。乃得矣。
是謂「今時何時」之術也。

注曰「「今時何小時。同Javascript之new Date().getHours()也。」」
今有一術。名之曰「今時何小時」。是術曰。
	注曰「「小時者。子丑寅卯辰巳午未申酉戌亥。各分初正。」」
	注曰「「子正得〇。丑初得一。乃至子初得二十三也。」」
	施「紀元時」。取一以施「彼時何小時」。乃得矣。
是謂「今時何小時」之術也。

注曰「「今刻何刻。同Javascript之Math.floor(new Date().getMinutes() / 15)也。」」
今有一術。名之曰「今刻何刻」。是術曰。
	注曰「「說文解字曰。晝夜百刻。後世改為九十六、百八、百二十刻。未知孰為可法。」」
	注曰「「初刻得〇。一刻得一。二刻得二。三刻得三。古法四刻得四。」」
	施「紀元時」。取一以施「彼刻何刻」。乃得矣。
是謂「今刻何刻」之術也。

注曰「「今分何分。同Javascript之new Date().getMinutes() % 15也。」」
今有一術。名之曰「今分何分」。是術曰。
	施「紀元時」。取一以施「彼分何分」。乃得矣。
是謂「今分何分」之術也。

注曰「「今秒何秒。同Javascript之new Date().getSeconds()也。」」
今有一術。名之曰「今秒何秒」。是術曰。
	施「紀元時」。取一以施「彼秒何秒」。乃得矣。
是謂「今秒何秒」之術也。

注曰「「既知某一紀元時。乃得其年月日時刻。故謂之彼。」」

吾有一列。名之曰「天干」。充「天干」。
	以「「甲」」以「「乙」」以「「丙」」以「「丁」」以「「戊」」。
	以「「己」」以「「庚」」以「「辛」」以「「壬」」以「「癸」」。
吾有一列。名之曰「地支」。充「地支」。
	以「「子」」以「「丑」」以「「寅」」以「「卯」」以「「辰」」以「「巳」」。
	以「「午」」以「「未」」以「「申」」以「「酉」」以「「戌」」以「「亥」」。
吾有一列。名之曰「數字」。充「數字」。
	以「「〇」」以「「一」」以「「二」」以「「三」」以「「四」」。
	以「「五」」以「「六」」以「「七」」以「「八」」以「「九」」。

吾有一術。名之曰「言序數」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	夫「甲」。夫十。取二以施「取底除」。名之曰「乙」。
	夫「乙」之「「餘」」。加其以一。夫「數字」之其。名之曰「數」。
	恆為是。
		夫「乙」之「「商」」。夫十。取二以施「取底除」。昔之「乙」者。今其是矣。
		夫「乙」之「「餘」」。加其以一。夫「數字」之其。加其以「數」。昔之「數」者。今其是矣。
		若「乙」之「「商」」等於零者。
			乃得「數」也。
	云云。
是謂「言序數」之術也。

吾有一術。名之曰「言百內數」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	夫「甲」。夫十。取二以施「取底除」。名之曰「乙」。
	夫「乙」之「「商」」。若其等於零者。
		夫「乙」之「「餘」」。加其以一。夫「數字」之其。乃得矣。云云。
	吾有一言。名之曰「數」。
	夫「乙」之「「商」」。若其等於一者。
		昔之「數」者。今「「十」」是矣。
	若非
		夫「乙」之「「商」」。加其以一。夫「數字」之其。加其以「「十」」。昔之「數」者。今其是矣。云云。
	夫「乙」之「「餘」」。若其大於零者。
		夫「乙」之「「餘」」。加其以一。夫「數字」之其。加「數」以其。昔之「數」者。今其是矣。云云。
	乃得「數」。
是謂「言百內數」之術也。

吾有一術。名之曰「言年月日」。欲行是術。必先得一數。曰「積日」。乃行是術曰。
	夫「積日」。取一以施「日積何月」。名之曰「積月」。
	夫「積月」。取一以施「月積何閏月」。名之曰「積閏月」。
	減「積月」以「積閏月」。除其以十二。取一以施「取底」。名之曰「積年」。
	有言「「西元」」。名之曰「年號」。
	減「積年」以二六九七。名之曰「年」。
	減「積月」以「積閏月」。除其以十二。所餘幾何。加其於一。名之曰「月」。
	有爻陰。名之曰「閏」。
	夫「積閏月」。取一以施「閏月積何月」。若其等於「積月」者。
		昔之「閏」者。今陽是矣。云云。
	夫「積月」。取一以施「月積何日」。減其於「積日」。加其以一。名之曰「日」。

	有言「年號」。名之曰「年月日」。
	若「年」不大於零者。
		加「年號」以「「前」」。昔之「年月日」者。今其是矣。
		減「年」於一。昔之「年」者。今其是矣。
	云云。
	若「年」不大於一百者。
		夫「年」。取一以施「言百內數」。加其以「「年」」。加「年月日」以其。昔之「年月日」者。今其是矣。
	若非。
		夫「年」。取一以施「言序數」。加其以「「年」」。加「年月日」以其。昔之「年月日」者。今其是矣。
	云云。
	減一於「積年」。除其以十。所餘幾何。加其以一。夫「天干」之其。加「年月日」以其。昔之「年月日」者。今其是矣。
	減一於「積年」。除其以十二。所餘幾何。加其以一。夫「地支」之其。加「年月日」以其。昔之「年月日」者。今其是矣。
	加「年月日」以「「年」」。昔之「年月日」者。今其是矣。

	若「閏」者。
		加「年月日」以「「閏」」。昔之「年月日」者。今其是矣。云云。
	若「月」等於一者。
		加「年月日」以「「正月」」。昔之「年月日」者。今其是矣。
	若非。
		夫「月」。取一以施「言百內數」。加其以「「月」」。加「年月日」以其。昔之「年月日」者。今其是矣。
	云云。

	若「日」不大於十者。
		加「年月日」以「「初」」。昔之「年月日」者。今其是矣。云云。
	夫「日」。取一以施「言百內數」。加其以「「日」」。加「年月日」以其。昔之「年月日」者。今其是矣。
	減一於「積日」。除其以十。所餘幾何。加其以一。夫「天干」之其。加「年月日」以其。昔之「年月日」者。今其是矣。
	減一於「積日」。除其以十二。所餘幾何。加其以一。夫「地支」之其。加「年月日」以其。昔之「年月日」者。今其是矣。
	加「年月日」以「「日」」。昔之「年月日」者。今其是矣。
	乃得「年月日」。
是謂「言年月日」之術也。

吾有一術。名之曰「言時刻」。欲行是術。必先得一數。曰「日內秒」。乃行是術曰。
	夫「日內秒」。夫三千六百。取二以施「取底除」。名之曰「甲」。
	夫「甲」之「「商」」。除其以二。取一以施「取頂」。加其以一。名之曰「乙」。
	若「乙」大於十二者。
		減十二於「乙」。昔之「乙」者。今其是矣。云云。
	夫「地支」之「乙」。名之曰「時刻」。

	夫「甲」之「「商」」。除其以二。所餘幾何。若其等於零者。
		加「時刻」以「「正」」。昔之「時刻」者。今其是矣。
	若非。
		加「時刻」以「「初」」。昔之「時刻」者。今其是矣。云云。

	夫「甲」之「「餘」」。夫九百。取二以施「取底除」。名之曰「丙」。
	夫「丙」之「「商」」。若其等於零者。
		加「時刻」以「「初刻」」。昔之「時刻」者。今其是矣。
	若非。
		夫「丙」之「「商」」。取一以施「言百內數」。加其以「「刻」」。
		加「時刻」以其。昔之「時刻」者。今其是矣。
	云云。

	夫「丙」之「「餘」」。夫六十。取二以施「取底除」。名之曰「丁」。
	夫「丁」之「「商」」。若其等於零者。
		夫「丁」之「「餘」」。若其大於零者。
			加「時刻」以「「零」」。昔之「時刻」者。今其是矣。云云。
	若非。
		夫「丁」之「「商」」。取一以施「言百內數」。加其以「「分」」。
		加「時刻」以其。昔之「時刻」者。今其是矣。
	云云。

	夫「丁」之「「餘」」。若其大於零者。
		夫「丁」之「「餘」」。取一以施「言百內數」。加其以「「秒」」。
		加「時刻」以其。昔之「時刻」者。今其是矣。
	云云。
	乃得「時刻」。
是謂「言時刻」之術也。

注曰「「言彼之日時。同Javascript之new Date(x * 1000).toString(), in Chinese calendar也。」」
今有一術。名之曰「言彼之日時」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫八萬六千四百。取二以施「取底除」。名之曰「乙」。
	夫「乙」之「「商」」。加其以一七〇四五五八。取一以施「言年月日」。名之曰「年月日」。
	夫「乙」之「「餘」」。取一以施「取底」。取一以施「言時刻」。名之曰「時刻」。
	加「年月日」以「時刻」。乃得矣。
是謂「言彼之日時」之術也。

注曰「「言彼之年月日。同Javascript之new Date(x * 1000).toDateString(), in Chinese calendar也。」」
今有一術。名之曰「言彼之年月日」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫八萬六千四百。取二以施「取底除」。名之曰「乙」。
	夫「乙」之「「商」」。加其以一七〇四五五八。取一以施「言年月日」。乃得矣。
是謂「言彼之年月日」之術也。

注曰「「言彼之時刻。同Javascript之new Date(x * 1000).toTimeString(), in Chinese calendar也。」」
今有一術。名之曰「言彼之時刻」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫八萬六千四百。取二以施「取底除」。名之曰「乙」。
	夫「乙」之「「餘」」。取一以施「取底」。取一以施「言時刻」。乃得矣。
是謂「言彼之時刻」之術也。

注曰「「彼年何年號。同Javascript之"西元" for modern dates也。」」
今有一術。名之曰「彼年何年號」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	乃得「「西元」」。
是謂「彼年何年號」之術也。

注曰「「彼年何年。同Javascript之new Date(x * 1000).getFullYear() for modern dates, in Chinese calendar也。」」
今有一術。名之曰「彼年何年」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼年積何年」於「時」。減其以二六九七。乃得矣。
是謂「彼年何年」之術也。

注曰「「彼年何干支。同Javascript之Get index (1 to 60) in the 60-year cycle也。」」
今有一術。名之曰「彼年何干支」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼年積何年」於「時」。減其以一。夫六十。取二以施「取底除」。
	夫其之「「餘」」。加其以一。乃得矣。
是謂「彼年何干支」之術也。

注曰「「彼年積何年。同Javascript之new Date(x * 1000).getFullYear() + 2697, in Chinese calendar也。」」
今有一術。名之曰「彼年積何年」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼月積何月」於「時」。名之曰「積月」。
	夫「積月」。取一以施「月積何閏月」。名之曰「積閏月」。
	減「積月」以「積閏月」。除其以十二。取一以施「取底」。乃得矣。
是謂「彼年積何年」之術也。

注曰「「彼月何月。同Javascript之new Date(x * 1000).getMonth() + 1, N + 0.5 for leap months, in Chinese calendar也。」」
今有一術。名之曰「彼月何月」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼月積何月」於「時」。名之曰「積月」。
	夫「積月」。取一以施「月積何閏月」。名之曰「積閏月」。
	減「積月」以「積閏月」。除其以十二。所餘幾何。加其於一。名之曰「月」。
	夫「積閏月」。取一以施「閏月積何月」。若其等於「積月」者。
		加五分於「月」。乃得矣。
	若非。
		乃得「月」也。
是謂「彼月何月」之術也。

注曰「「彼月積何月。同Javascript之Get continuously counting month number也。」」
今有一術。名之曰「彼月積何月」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼日積何日」於「時」。取一以施「日積何月」。乃得矣。
是謂「彼月積何月」之術也。

注曰「「彼日何日。同Javascript之new Date(x * 1000).getDate(), in Chinese calendar也。」」
今有一術。名之曰「彼日何日」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼日積何日」於「時」。名之曰「積日」。
	夫「積日」。取一以施「日積何月」。取一以施「月積何日」。減其於「積日」。加其以一。乃得矣。
是謂「彼日何日」之術也。

注曰「「彼日何干支。同Javascript之Get index (1 to 60) in the 60-day cycle也。」」
今有一術。名之曰「彼日何干支」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼日積何日」於「時」。減其以一。夫六十。取二以施「取底除」。
	夫其之「「餘」」。加其以一。乃得矣。
是謂「彼日何干支」之術也。

注曰「「彼日積何日。同Javascript之Get continuously counting day number也。」」
今有一術。名之曰「彼日積何日」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫八萬六千四百。取二以施「取底除」。
	夫其之「「商」」。加其以一七〇四五五八。乃得矣。
是謂「彼日積何日」之術也。

注曰「「彼時何時。同Javascript之Get index (1 to 12) in the 12 divisions of day也。」」
今有一術。名之曰「彼時何時」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「彼時何小時」於「時」。除其以二。取一以施「取頂」。加其以一。名之曰「甲」。
	若「甲」大於十二者。
		減十二於「甲」。乃得矣。
	若非。
		乃得「甲」也。
是謂「彼時何時」之術也。

注曰「「彼時何小時。同Javascript之new Date(x * 1000).getHours()也。」」
今有一術。名之曰「彼時何小時」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫八萬六千四百。取二以施「取底除」。
	夫其之「「餘」」。夫三千六百。取二以施「取底除」。
	夫其之「「商」」。乃得矣。
是謂「彼時何小時」之術也。

注曰「「彼刻何刻。同Javascript之Math.floor(new Date(x * 1000).getMinutes() / 15)也。」」
今有一術。名之曰「彼刻何刻」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫三千六百。取二以施「取底除」。
	夫其之「「餘」」。夫九百。取二以施「取底除」。
	夫其之「「商」」。乃得矣。
是謂「彼刻何刻」之術也。

注曰「「彼分何分。同Javascript之new Date(x * 1000).getMinutes() % 15也。」」
今有一術。名之曰「彼分何分」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫九百。取二以施「取底除」。
	夫其之「「餘」」。夫六十。取二以施「取底除」。
	夫其之「「商」」。乃得矣。
是謂「彼分何分」之術也。

注曰「「彼秒何秒。同Javascript之new Date(x * 1000).getSeconds()也。」」
今有一術。名之曰「彼秒何秒」。欲行是術。必先得一數。曰「時」。乃行是術曰。
	施「時差」於「時」。加其於「時」。名之曰「甲」。
	夫「甲」。夫六十。取二以施「取底除」。
	夫其之「「餘」」。取一以施「取底」。乃得矣。
是謂「彼秒何秒」之術也。

吾有一術。名之曰「月積何日」。欲行是術。必先得一數。曰「積月」。乃行是術曰。
	減「積月」以「始曆月」。加其以一。名之曰「引」。
	若「引」小於一者。
		嗚呼。「「越界」」之禍。乃歸空無也。
	夫「曆月表」之長。若「引」大於其者。
		嗚呼。「「越界」」之禍。乃歸空無也。
	夫「曆月表」之「引」。名之曰「校」。
	乘「積月」以二五一〇一。除其以八五〇。減其以一。取一以施「取頂」。加其以「校」。乃得矣。
是謂「月積何日」之術也。

吾有一術。名之曰「日積何月」。欲行是術。必先得一數。曰「積日」。乃行是術曰。
	加「積日」以一。乘其以八五〇。除其以二五一〇一。取一以施「取整」。名之曰「積月」。
	施「月積何日」於「積月」。名之曰「初日」。
	若「積日」小於「初日」者。
		減一於「積月」。乃得矣。
	若非。
		乃得「積月」也。
是謂「日積何月」之術也。

吾有一術。名之曰「閏月積何月」。欲行是術。必先得一數。曰「積閏月」。乃行是術曰。
	減「積閏月」以「始閏月」。加其以一。名之曰「引」。
	若「引」小於一者。
		若「引」等於零者。
			乃得負一京。
		若非。
			嗚呼。「「越界」」之禍。乃歸空無也。
	云云。
	夫「閏月表」之長。若「引」大於其者。
		夫「閏月表」之長。加其以一。若「引」等於其者。
			乃得一京。
		若非。
			嗚呼。「「越界」」之禍。乃歸空無也。
	云云。
	夫「閏月表」之「引」。名之曰「校」。
	乘「積閏月」以三一五七。除其以九四。減其以二七。取一以施「取頂」。加其以「校」。乃得矣。
是謂「閏月積何月」之術也。

吾有一術。名之曰「月積何閏月」。欲行是術。必先得一數。曰「積月」。乃行是術曰。
	加「積月」以二七。乘其以九四。除其以三一五七。取一以施「取整」。名之曰「積閏月」。
	施「閏月積何月」於「積閏月」。名之曰「閏月」。
	若「積月」小於「閏月」者。
		減一於「積閏月」。乃得矣。
	若非。
		乃得「積閏月」也。
是謂「月積何閏月」之術也。


================================================
FILE: lib/曆表.wy
================================================
注曰「「此文程式之作文也。勿施以修訂。」」
注曰「「程式書於文 tools/make_calendar.js 」」

今有一數。曰五七一〇五。名之曰「始曆月」。
今有一列。名之曰「曆月表」。
今有一數。曰一七〇一。名之曰「始閏月」。
今有一列。名之曰「閏月表」。

充「曆月表」。
	以一以一以一以一以〇以一以〇以〇以〇以負一以〇以〇以一以一以一。
	以一以一以〇以一以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇。
	以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一。
	以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一。
	以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以負一以〇以〇以一以一以一以一以一。
	以〇以一以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇。
	以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一。
	以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇。
	以〇以〇以〇以一以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以一以〇。
	以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一。
	以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇。
	以一以一以二以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇。
	以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇。
	以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇。
	以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一。
	以二以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇。
	以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一。
	以〇以一以一以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇。
	以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以〇以〇以一。
	以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一。
	以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇。
	以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一。
	以一以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇。
	以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一。
	以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一。
	以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇。
	以一以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以〇以〇以一以一以一以一以一。
	以〇以一以〇以〇以〇以一以〇以〇以一以〇以一以一以一以〇以一以〇以一以〇以一以〇。
	以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以一以〇。
	以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一以〇。
	以一以一以一以一以一以〇以一以〇以負一以〇以〇以〇以〇以一以一以一以一以一以〇以一。
	以〇以〇以〇以一以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一。
	以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇。
	以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一。
	以一以一以一以〇以一以〇以負一以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一。
	以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇。
	以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一。
	以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一。
	以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一。
	以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇。
	以〇以〇以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以〇以一。
	以一以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以一以一以〇以一以〇。
	以一以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以一以〇以〇。
	以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一。
	以〇以〇以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇。
	以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一。
	以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇。
	以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以一以〇。
	以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以一以〇以一以一以二以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一。
	以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一。
	以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以〇。
	以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇。
	以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇。
	以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一。
	以一以一以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一。
	以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇。
	以一以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一。
	以〇以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一。
	以一以〇以〇以〇以負一以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以一以〇以〇以一以〇以一以〇以一。
	以〇以一以〇以〇以〇以一以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇。
	以一以〇以一以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一。
	以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇。
	以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇。
	以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一。
	以〇以〇以〇以〇以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇。
	以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以〇以一以一以一。
	以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇。
	以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一。
	以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一。
	以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一。
	以〇以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇。
	以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以一。
	以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一。
	以一以一以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇。
	以〇以〇以一以〇以一以〇以一以一以一以〇以一以〇以一以〇以〇以〇以〇以〇以〇以一。
	以〇以一以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以一以一以一以一以一以〇。
	以一以〇以〇以〇以〇以〇以一以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一。
	以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一。
	以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以一以〇以一以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一。
	以〇以一以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇。
	以〇以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以一以一。
	以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇。
	以〇以〇以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以〇以〇以〇以一以〇。
	以一以一以一以一以一以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一。
	以〇以一以〇以一以〇以一以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇。
	以一以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以〇。
	以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇。
	以〇以〇以〇以一以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以一以〇以一以一。
	以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以一以一以〇以一以〇以一以〇以〇。
	以〇以一以〇以一以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一以一。
	以一以一以〇以一以〇以一以〇以一以〇以〇以〇以一以〇以一以一以一以一以〇以一以〇。
	以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇。
	以〇以一以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以一以〇以一以一以一以一。
	以一以〇以〇以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以一。
	以〇以一以一以〇以一以〇以一以〇以一以〇以〇以〇以〇以〇以一以〇以一以一以一以一。
	以〇以一以〇以一以〇以〇以〇以一以〇以一以〇以一以一以一以一以〇以一以〇以〇以〇。
	以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一。
	以一以一以一以一以一以一以〇以一以〇以負一以〇以〇以一以〇以一以一以一以一以一以〇。
	以一以〇以〇以〇以〇以〇以〇以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一。
	以一以〇以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一。
	以〇以〇以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇。
	以一以〇以一以〇以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以〇以一以一以一。
	以一以一以一以一以〇以一以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇。
	以〇以〇以〇以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一。
	以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇。
	以〇以〇以〇以一以〇以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以〇以一以〇。
	以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以〇以一以〇以一以〇以一以一以一。
	以〇以一以〇以一以〇以〇以〇以〇以一以〇以一以一以一以一以一以〇以一以〇以〇以〇。
	以一以〇以〇以一以一以一以一以一以〇以一以〇以〇以〇以〇以〇以一以一以〇以一以一。
	以一以〇以一以〇以〇以〇以〇以〇以一以一以一以一以一以一以〇以一以〇以〇以〇以〇。
	以〇以一以〇以一以一以一以一以一以一以一以〇以〇以〇以〇以〇以〇以一以〇以一以一。
	以一以一以一以〇以一以〇以〇以〇以〇以一以〇以一以〇以一以〇以一以〇以一以〇以一。
	以〇以一以〇以〇以〇以〇以一以〇以一以〇以一。

充「閏月表」。
	以負三以負一以一以二以負二以〇以二以負三以〇以一以二以負一以〇以二以負二以負一以一以三以負一。
	以〇以三以負二以負一以一以負二以負二以〇以一以負二以負二以一以二以負一以〇以二以負一以負一以一以二。
	以負三以〇以一以一以負一以一以二以負二以〇以一以負二以負一以〇以三以負二以〇以二以負三以負一以〇。
	以三以負二以〇以二以負三以負一以〇以二以負二以負一以二以負二以負一以〇以三以負二。


================================================
FILE: lib/渾沌經.wy
================================================
吾嘗觀「「格物」」之書。方悟「取物」「置物」「列物之端」「識類」之義。

吾有一言。曰「「「」」」。名之曰「引號」。
夫「引號」之一。名之曰「引起」。
夫「引號」之二。名之曰「引迄」。
吾有一列。名之曰「位名」。充「位名」
以「「〇」」以「「一」」以「「二」」以「「三」」以「「四」」
以「「五」」以「「六」」以「「七」」以「「八」」以「「九」」。

吾有一術。名之曰「斬渾沌」。欲行是術。必先得一言。曰「渾沌語」。乃行是術曰。
	吾有一列。名之曰「諸咒」。充「諸咒」以「「物」」以「「言」」以「「數」」以「「爻」」以「「列」」以「「之」」以「「也」」。
	吾有一列。名之曰「渾沌碎」。
	有數一。名之曰「讀」。
	有數零。名之曰「層」。
	吾有一言。名之曰「辭」。

	恆為是。若「讀」大於「渾沌語」之長者乃止也。
		若「渾沌語」之「讀」等於「引起」者。
			若「層」不等於零者。
				夫「渾沌語」之「讀」。加其於「辭」。昔之「辭」者。今其是矣。
			云云。
			加「層」以一。昔之「層」者。今其是矣。
		或若「渾沌語」之「讀」等於「引迄」者。
			減「層」以一。昔之「層」者。今其是矣。
			若「層」等於零者。
				充「渾沌碎」以「辭」。
				昔之「辭」者。今「「」」是矣。
			若非。
				夫「渾沌語」之「讀」。加其於「辭」。昔之「辭」者。今其是矣。
			云云。
		或若「層」大於零者。
			夫「渾沌語」之「讀」。加其於「辭」。昔之「辭」者。今其是矣。
		若非。
			凡「諸咒」中之「咒」。
				若「渾沌語」之「讀」等於「咒」者
					充「渾沌碎」以「咒」。
				乃止也。
			云云。
		云云。
	加一以「讀」。昔之「讀」者。今其是矣云云。
	乃得「渾沌碎」。
是謂「斬渾沌」之術也。

吾有一術。名之曰「食數」。欲行是術。必先得一言。曰「數名」。乃行是術曰。
	吾有一數。曰一。名之曰「正負」。
	夫「數名」之一。若其等於「「負」」者。
		夫「數名」之其餘。昔之「數名」者。今其是矣。
		昔之「正負」者。今負一是矣。
	云云。
	吾有二數。名之曰「整」曰「小」。
	吾有二數。曰一曰一。名之曰「讀」曰「小長」。
	有爻陰。名之曰「小耶」。
	恆為是。若「讀」大於「數名」之長者乃止也。
		若「讀」等於「「·」」者
			昔之「小耶」者。今陽是矣。
		若非。
			有數一。名之曰「位」
			恆為是。若「位」大於「位名」之長者乃止也。
				若「位名」之「位」等於「數名」之「讀」者乃止也。
			加一以「位」。昔之「位」者。今其是矣云云。
			減「位」以一。昔之「位」者。今其是矣。

			若「小耶」者。
				乘「小」以十。加其以「位」。昔之「小」者。今其是矣。
				加「小長」以一。昔之「小長」者。今其是矣。
			若非。
				乘「整」以十。加其以「位」。昔之「整」者。今其是矣。
			云云。
		云云。
	加一以「讀」。昔之「讀」者。今其是矣云云。
	為是「小長」遍。乘「小」以零又一分。昔之「小」者。今其是矣。云云。
	加「整」以「小」。乘其以「正負」。乃得矣。
是謂「食數」之術也。

吾有一術名之曰「食列」。欲行是術。必先得一列。曰「渾沌碎」。乃行是術曰。
	吾有一列。名之曰「渾沌列」。
	有數一。名之曰「讀」。
	恆為是。若「讀」大於「渾沌碎」之長者乃止也。
		夫「渾沌碎」之「讀」。名之曰「類」
		若「類」等於「「數」」者。
			加「讀」以一。夫「渾沌碎」之其。取一以施「食數」。充「渾沌列」以其。
			加「讀」以二。昔之「讀」者。今其是矣。
		或若「類」等於「「言」」者。
			加「讀」以一。夫「渾沌碎」之其。充「渾沌列」以其。
			加「讀」以二。昔之「讀」者。今其是矣。
		或若「類」等於「「爻」」者。
			加「讀」以一。夫「渾沌碎」之其。
			若其等於「「陰」」者。充「渾沌列」以陰。
			若非。充「渾沌列」以陽也。
			加「讀」以二。昔之「讀」者。今其是矣。
		若非
			吾有一數。名之曰「層」。
			加「讀」以一。名之曰「次讀」。
			吾有一列。名之曰「句」。
			恆為是。若「次讀」大於「渾沌碎」之長者乃止也。
				若「渾沌碎」之「次讀」等於「「物」」者。
					加「層」以一。昔之「層」者。今其是矣。
				或若「渾沌碎」之「次讀」等於「「列」」者。
					加「層」以一。昔之「層」者。今其是矣。
				或若「渾沌碎」之「次讀」等於「「也」」者。
					若「層」等於零者。
						若「類」等於「「物」」者。
							施「食物」於「句」。充「渾沌列」以其。
						若非。
							施「食列」於「句」。充「渾沌列」以其。
						云云。
					乃止也。
					減「層」以一。昔之「層」者。今其是矣。
				云云。
				夫「渾沌碎」之「次讀」。充「句」以其。
			加「次讀」以一。昔之「次讀」者。今其是矣云云。
			加「次讀」以一。昔之「讀」者。今其是矣
		云云。
	云云。
	乃得「渾沌列」。
是謂「食列」之術也。

吾有一術名之曰「食物」。欲行是術。必先得一列。曰「渾沌碎」。乃行是術曰。
	吾有一物。名之曰「渾沌物」。
	有數二。名之曰「讀」。
	恆為是。若「讀」大於「渾沌碎」之長者乃止也。
		夫「渾沌碎」之「讀」。名之曰「端」。
		加「讀」以一。夫「渾沌碎」之其。名之曰「類」。

		若「類」等於「「數」」者。
			加「讀」以二。夫「渾沌碎」之其。取一以施「食數」。施「置物」於「渾沌物」於「端」於其。
			加「讀」以四。昔之「讀」者。今其是矣。
		或若「類」等於「「言」」者。
			加「讀」以二。夫「渾沌碎」之其。施「置物」於「渾沌物」於「端」於其。
			加「讀」以四。昔之「讀」者。今其是矣。
		或若「類」等於「「爻」」者。
			加「讀」以二。夫「渾沌碎」之其。
			若其等於「「陰」」者。施「置物」於「渾沌物」於「端」於陰。
			若非。施「置物」於「渾沌物」於「端」於陽也。
			加「讀」以四。昔之「讀」者。今其是矣。
		若非
			吾有一數。名之曰「層」。
			加「讀」以二。名之曰「次讀」。
			吾有一列。名之曰「句」。
			恆為是。若「次讀」大於「渾沌碎」之長者乃止也。
				若「渾沌碎」之「次讀」等於「「物」」者。
					加「層」以一。昔之「層」者。今其是矣。
				或若「渾沌碎」之「次讀」等於「「列」」者。
					加「層」以一。昔之「層」者。今其是矣。
				或若「渾沌碎」之「次讀」等於「「也」」者。
					若「層」等於零者。
						若「類」等於「「物」」者。
							施「食物」於「句」。施「置物」於「渾沌物」於「端」於其。
						若非。
							施「食列」於「句」。施「置物」於「渾沌物」於「端」於其。
						云云。
					乃止也。
					減「層」以一。昔之「層」者。今其是矣。
				云云。
				夫「渾沌碎」之「次讀」。充「句」以其。
			加「次讀」以一。昔之「次讀」者。今其是矣云云。
			加「次讀」以二。昔之「讀」者。今其是矣
		云云。
	云云。
	乃得「渾沌物」。
是謂「食物」之術也。

今有一術。名之曰「食渾沌」。欲行是術。必先得一言。曰「渾沌語」。乃行是術曰。
	施「斬渾沌」於「渾沌語」。名之曰「渾沌碎」。
	夫「渾沌碎」之其餘。取一以施「食物」。乃得矣。
是謂「食渾沌」之術也。

今有一術。名之曰「食諸渾沌」。欲行是術。必先得一言。曰「渾沌語」。乃行是術曰。
	施「斬渾沌」於「渾沌語」。名之曰「渾沌碎」。
	夫「渾沌碎」之其餘。取一以施「食列」。乃得矣。
是謂「食諸渾沌」之術也。


吾有一言。曰「「 」」名之曰「挪符」。
吾有一言。曰「「\n」」名之曰「抬符」。
吾有一術。名之曰「包數」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	吾有一言。名之曰「正負」。
	若「甲」小於零者。
		乘「甲」以負一。昔之「甲」者。今其是矣。
		昔之「正負」者。今「「負」」是矣。
	云云。
	除「甲」以一。所餘幾何。名之曰「小數」
	減「小數」於「甲」。名之曰「整數」。
	吾有二言。名之曰「小」曰「整」。
	恆為是。若「整數」不大於零者乃止也。
		除「整數」以十。所餘幾何。名之曰「位」。
		加「位」以一。夫「位名」之其。加其以「整」。昔之「整」者。今其是矣。
		減「整數」以「位」。除其以十。昔之「整數」者。今其是矣。
	云云。
	恆為是。若「小數」不大於零者乃止也。
		乘「小數」以十。昔之「小數」者。今其是矣。
		除「小數」以一。所餘幾何。名之曰「位」。
		加「位」以一。夫「位名」之其。加其於「小」。昔之「小」者。今其是矣。
		減「小數」以「位」。昔之「小數」者。今其是矣。
	云云。
	加「正負」以「整」。昔之「整」者。今其是矣。
	夫「小」之長。若其然者。
		加「整」以「「·」」。加其以「小」。乃得矣。
	云云。
	乃得「整」。
是謂「包數」之術也。

吾有一術。名之曰「暗包渾沌」。欲行是術。必先得一言曰「類」。一元曰「實」。一數曰「挪抬」。乃行是術曰。
	吾有一言。名之曰「渾沌語」。
	若「類」等於「「物」」者。
		加「渾沌語」以「抬符」昔之「渾沌語」者。今其是矣。
		夫「實」。加「挪抬」以一。取二以施「包物」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。
		為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。
		加「渾沌語」以「「也」」加其以「抬符」。昔之「渾沌語」者。今其是矣。

	或若「類」等於「「列」」者。
		加「渾沌語」以「抬符」昔之「渾沌語」者。今其是矣。
		夫「實」。加「挪抬」以一。取二以施「包列」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。
		為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。
		加「渾沌語」以「「也」」加其以「抬符」。昔之「渾沌語」者。今其是矣。

	或若「類」等於「「言」」者。
		加「渾沌語」以「引起」加其以「實」加其以「引迄」。加其以「抬符」昔之「渾沌語」者。今其是矣。
	或若「類」等於「「爻」」者。
		吾有一言。曰「「陽」」。名之曰「爻名」
		夫「實」。若其不然者。昔之「爻名」者。今「「陰」」是矣也。
		加「渾沌語」以「引起」加其以「爻名」加其以「引迄」。加其以「抬符」昔之「渾沌語」者。今其是矣。
	或若「類」等於「「數」」者。
		施「包數」於「實」。名之曰「數名」。
		加「渾沌語」以「引起」加其以「數名」加其以「引迄」。加其以「抬符」昔之「渾沌語」者。今其是矣。
	云云。
	乃得「渾沌語」
是謂「暗包渾沌」之術也。

吾有一術。名之曰「包列」。欲行是術。必先得一列曰「渾沌列」。一數曰「挪抬」。乃行是術曰。
	吾有一言。名之曰「渾沌語」。
	凡「渾沌列」中之「實」
		施「識類」於「實」。名之曰「類」。

		為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。
		加「渾沌語」以「類」。
		昔之「渾沌語」者。今其是矣。

		施「暗包渾沌」於「類」於「實」於「挪抬」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。
	云云。
	乃得「渾沌語」
是謂「包列」之術也。

吾有一術。名之曰「包物」。欲行是術。必先得一物曰「渾沌物」。一數曰「挪抬」。乃行是術曰。

	吾有一言。名之曰「渾沌語」。

	施「列物之端」於「渾沌物」。名之曰「諸端」。

	凡「諸端」中之「端」
		施「取物」於「渾沌物」於「端」。名之曰「實」。
		施「識類」於「實」。名之曰「類」。

		為是「挪抬」遍。加「渾沌語」以「挪符」。昔之「渾沌語」者。今其是矣也。
		加「渾沌語」以「「之」」。加其以「引起」。加其以「端」。加其以「引迄」。加其以「類」。
		昔之「渾沌語」者。今其是矣。

		施「暗包渾沌」於「類」於「實」於「挪抬」。加其於「渾沌語」。昔之「渾沌語」者。今其是矣。
	云云。
	乃得「渾沌語」
是謂「包物」之術也。


今有一術。名之曰「包渾沌」。欲行是術。必先得一物。曰「渾沌物」。乃行是術曰。
	施「包物」於「渾沌物」於一。名之曰「餛飩語」。
	加「抬符」以「餛飩語」。加其於「「物」」。加其以「「也」」。乃得矣。
是謂「包渾沌」之術也。


今有一術。名之曰「包諸渾沌」。欲行是術。必先得一列。曰「渾沌列」。乃行是術曰。
	施「包列」於「渾沌列」於一。名之曰「餛飩語」。
	加「抬符」以「餛飩語」。加其於「「列」」。加其以「「也」」。乃得矣。
是謂「包諸渾沌」之術也。



================================================
FILE: lib/算經.wy
================================================
吾有二數。曰一。曰一。名之曰「進制」。曰「退制」。
吾有三數。曰零。曰一。曰一。名之曰「總算位」。曰「上位冪」。曰「下位冪」。
吾有三數。曰零。曰一。曰一。名之曰「至大指」。曰「巨位冪」。曰「至巨數」。
吾有三數。曰零。曰一。曰一。名之曰「至小指」。曰「微位冪」。曰「至微數」。
吾有一數。曰一。名之曰「位極差」。
吾有二數。曰零。曰一。名之曰「浮點零」。曰「浮點一」。

吾有一術。名之曰「試界」。欲行是術。必先得三數。曰「限」。曰「元」。曰「基」。二術。曰「合」。曰「據」。乃行是術曰。
	吾有一術。名之曰「造表列」。欲行是術。必先得二數。曰「引」。曰「實」。乃行是術曰。
		吾有一物。名之曰「表列」。其物如是。
			物之「「引」」者。數曰「引」。
			物之「「實」」者。數曰「實」。
		是謂「表列」之物也。
		乃得「表列」。
	是謂「造表列」之術也。
	吾有一術。名之曰「新據」。欲行是術。必先得二數。曰「引」。曰「實」。乃行是術曰。
		若「引」不小於「限」者。乃得陽也。
		施「據」於「實」。若其然者。乃得陽也。
		乃得陰。
	是謂「新據」之術也。

	施「新據」於零。於「元」。若其然者。夫零。夫「元」。取二以施「造表列」。乃得矣。云云。
	施「新據」於一。於「基」。若其然者。夫一。夫「基」。取二以施「造表列」。乃得矣。云云。
	吾有二數。曰一。曰「基」。名之曰「引」。曰「實」。
	吾有一列。名之曰「記表列」。
	恆為是。
		加「引」於「引」。名之曰「新引」。
		夫「實」。夫「實」。取二以施「合」。名之曰「新實」。
		施「新據」於「新引」。於「新實」。若其然者。乃止也。
		夫「引」。夫「實」。取二以施「造表列」。充「記表列」以其。
		昔之「引」者。今「新引」是矣。
		昔之「實」者。今「新實」是矣。
	云云。
	夫「記表列」之長。名之曰「甲」。
	恆為是。
		若「甲」等於零者。乃止也。
		夫「記表列」之「甲」。名之曰「表列」。
		夫「表列」之「「引」」。加其於「引」。名之曰「新引」。
		夫「表列」之「「實」」。夫「實」。取二以施「合」。名之曰「新實」。
		施「新據」於「新引」。於「新實」。若其不然者。
			昔之「引」者。今「新引」是矣。
			昔之「實」者。今「新實」是矣。
		云云。
		減一於「甲」。昔之「甲」者。今其是矣。
	云云。
	加一於「引」。夫「基」。夫「實」。取二以施「合」。取二以施「造表列」。乃得矣。
是謂「試界」之術也。

吾有一術。名之曰「盤古」。乃行是術曰。
	除一於三。若其等於零者。
		噫。夫「「告。計算機除不盡而捨餘者。不可行本算經之術。」」。書之。
		乃歸空無也。

	有數五分。名之曰「寅」。減「寅」以「寅」。名之曰「卯」。乘「卯」以「卯」。昔之「浮點零」者。今其是矣。
	加一於「浮點零」。昔之「浮點一」者。今其是矣。

	吾有一列。名之曰「素數」。充「素數」以二。以三。以五。以七。以十一。以十三。
	有數零。名之曰「進制素因數」。
	昔之「進制」者。今「浮點一」是矣。
	凡「素數」中之「法」。
		加一於「法」。除其以「法」。減其以一。乘其以「法」。名之曰「餘」。
		若「餘」等於一者。
			乘「法」於「進制」。昔之「進制」者。今其是矣。
			加一於「進制素因數」。昔之「進制素因數」者。今其是矣。
		云云。
		若「餘」等於零者。
			噫。夫「「告。計算機除不盡而不得分釐者。不可行本算經之術。」」。書之。
			乃歸空無也。
	云云。
	若「進制素因數」大於二者。
		噫。夫「「告。計算機掩絲毫之瑕而求整者。不可行本算經之術。」」。書之。
		乃歸空無也。
	若「進制」不等於二者。
		噫。夫「「告。計算機非二進者。不可行本算經之術。」」。書之。
		乃歸空無也。
	除「進制」於一。昔之「退制」者。今其是矣。

	吾有一術。名之曰「加」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
		加「甲」於「乙」。乃得矣。
	是謂「加」之術也。
	吾有一術。名之曰「乘」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
		乘「甲」於「乙」。乃得矣。
	是謂「乘」之術也。
	吾有一術。名之曰「位溢乎」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
		乘「甲」以「進制」。名之曰「乙」。
		加一於「乙」。減其以「乙」。若其等於一者。乃得陰。若非。乃得陽也。
	是謂「位溢乎」之術也。

	有數一萬。名之曰「試位限」。
	施「試界」於「試位限」。於「浮點一」。於「進制」。於「乘」。於「位溢乎」。名之曰「算限表」。
	夫「算限表」之「「引」」。若其不小於「試位限」者。
		噫。夫「「告。計算機算位無限者。不可行本算經之術。」」。書之。
		乃歸空無也。
	夫「算限表」之「「引」」。加其以一。昔之「總算位」者。今其是矣。
	夫「算限表」之「「實」」。昔之「上位冪」者。今其是矣。
	除一以「上位冪」。昔之「下位冪」者。今其是矣。
	加一以「下位冪」。減其以一。若其不等於「下位冪」者。
		噫。夫「「告。計算機非二進者。不可行本算經之術。」」。書之。
		乃歸空無也。

	吾有一術。名之曰「上溢乎」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
		乘「甲」以「進制」。名之曰「乙」。
		乘「乙」以「進制」。若其大於「乙」者。乃得陰。若非。乃得陽也。
	是謂「上溢乎」之術也。
	吾有一術。名之曰「下溢乎」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
		乘「甲」以「退制」。名之曰「乙」。
		若「乙」等於零者。乃得陽也。
		若「乙」小於「甲」者。乃得陰也。
		乃得陽。
	是謂「下溢乎」之術也。

	有數一億。名之曰「試指限」。
	施「試界」於「試指限」。於「浮點一」。於「進制」。於「乘」。於「上溢乎」。名之曰「上限表」。
	夫「上限表」之「「引」」。昔之「至大指」者。今其是矣。
	夫「上限表」之「「實」」。昔之「巨位冪」者。今其是矣。
	減「進制」以「下位冪」。乘其以「巨位冪」。昔之「至巨數」者。今其是矣。

	施「試界」於「試指限」。於「浮點一」。於「退制」。於「乘」。於「下溢乎」。名之曰「下限表」。
	夫「下限表」之「「引」」。減其於「總算位」。減其以一。昔之「至小指」者。今其是矣。
	夫「下限表」之「「實」」。昔之「至微數」者。今其是矣。
	乘「至微數」以「上位冪」。昔之「微位冪」者。今其是矣。
	減「總算位」於「至小指」。減其於「至大指」。昔之「位極差」者。今其是矣。

	注曰「「以上驗算制。」」
是謂「盤古」之術也。
施「盤古」。

注曰「「圓周率。同Javascript之Math.PI也。」」
今有一數。曰三·一四一五九二六五三五八九七九三二三八四六二六四三三八三二七九五〇二八八四一九七。名之曰「圓周率」。
注曰「「倍圓周率。同Javascript之Math.PI * 2也。」」
今有一數。曰六·二八三一八五三〇七一七九五八六四七六九二五二八六七六六五五九〇〇五七六八三九四。名之曰「倍圓周率」。
注曰「「半圓周率。同Javascript之Math.PI / 2也。」」
今有一數。曰一·五七〇七九六三二六七九四八九六六一九二三一三二一六九一六三九七五一四四二〇九九。名之曰「半圓周率」。
注曰「「四分圓周率。同Javascript之Math.PI / 4也。」」
今有一數。曰〇·七八五三九八一六三三九七四四八三〇九六一五六六〇八四五八一九八七五七二一〇四九三。名之曰「四分圓周率」。
注曰「「自然常數。同Javascript之Math.E也。」」
今有一數。曰二·七一八二八一八二八四五九〇四五二三五三六〇二八七四七一三五二六六二四九七七五七。名之曰「自然常數」。
注曰「「歐拉常數。同Javascript之0.5772156649015329也。」」
今有一數。曰〇·五七七二一五六六四九〇一五三二八六〇六〇六五一二〇九〇〇八二四〇二四三一〇四二二。名之曰「歐拉常數」。
注曰「「黃金分割數。同Javascript之1.618033988749895也。」」
今有一數。曰一·六一八〇三三九八八七四九八九四八四八二〇四五八六八三四三六五六三八一一七七二〇。名之曰「黃金分割數」。
注曰「「二之平方根。同Javascript之Math.SQRT2也。」」
今有一數。曰一·四一四二一三五六二三七三〇九五〇四八八〇一六八八七二四二〇九六九八〇七八五七〇。名之曰「二之平方根」。
注曰「「二之對數。同Javascript之Math.LN2也。」」
今有一數。曰〇·六九三一四七一八〇五五九九四五三〇九四一七二三二一二一四五八一七六五六八〇七五五。名之曰「二之對數」。
注曰「「十之對數。同Javascript之Math.LN10也。」」
今有一數。曰二·三〇二五八五〇九二九九四〇四五六八四〇一七九九一四五四六八四三六四二〇七六〇一。名之曰「十之對數」。

注曰「「不可算數乎。同Javascript之Number.isNaN也。」」
今有一術。名之曰「不可算數乎」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	若「甲」等於「甲」者。乃得陰。
	若非。乃得陽也。
是謂「不可算數乎」之術也。

吾有一術。名之曰「下溢」。欲行是術。必先得一數。曰「符」。乃行是術曰。
	乘「符」以「微位冪」。乘其以「至微數」。乃得矣。
是謂「下溢」之術也。

吾有一術。名之曰「上溢」。欲行是術。必先得一數。曰「符」。乃行是術曰。
	乘「符」以「至巨數」。乘其以「至巨數」。乃得矣。
是謂「上溢」之術也。

吾有一術。名之曰「除以零」。欲行是術。必先得一數。曰「符」。乃行是術曰。
	除「符」以「浮點零」。乃得矣。
是謂「除以零」之術也。

吾有一術。名之曰「不可算」。乃行是術曰。
	除「浮點零」於「浮點零」。乃得矣。
是謂「不可算」之術也。

吾有一術。名之曰「求進冪」。欲行是術。必先得一數。曰「位」。乃行是術曰。
	吾有一術。名之曰「吾之冪」。欲行是術。必先得二數。曰「底」。曰「指」。乃行是術曰。
		有數「底」。名之曰「甲」。
		有數「浮點一」。名之曰「冪」。
		恆為是。
			若「指」等於零者。乃止也。
			除「指」以二。所餘幾何。名之曰「餘」。
			若「餘」大於零者。乘「甲」於「冪」。昔之「冪」者。今其是矣。云云。
			乘「甲」於「甲」。昔之「甲」者。今其是矣。
			減「餘」於「指」。除其以二。昔之「指」者。今其是矣。
		云云。
		乃得「冪」。
	是謂「吾之冪」之術也。
	若「位」小於零者。
		夫「退制」。減零以「位」。取二以施「吾之冪」。乃得矣。
	若非。
		夫「進制」。夫「位」。取二以施「吾之冪」。乃得矣。
	云云。
是謂「求進冪」之術也。

吾有三數。名之曰「取位常數甲」。曰「取位常數乙」。曰「取位上溢限」。
吾有三數。名之曰「分算常數」。曰「分算上溢限甲」。曰「分算上溢限乙」。

吾有一術。名之曰「伏羲」。乃行是術曰。
	加一於「上位冪」。昔之「取位常數甲」者。今其是矣。
	除二於「下位冪」。減其於一。昔之「取位常數乙」者。今其是矣。
	除「上位冪」於「巨位冪」。昔之「取位上溢限」者。今其是矣。

	加一於「總算位」。名之曰「甲」。
	除二於「甲」。所餘幾何。減其於「甲」。除其以二。名之曰「半算位」。
	施「求進冪」於「半算位」。名之曰「半位冪」。
	加一於「半位冪」。昔之「分算常數」者。今其是矣。
	除「半位冪」於「巨位冪」。昔之「分算上溢限甲」者。今其是矣。
	乘「半位冪」於「下位冪」。減其於「進制」。乘其以「巨位冪」。昔之「分算上溢限乙」者。今其是矣。
是謂「伏羲」之術也。
施「伏羲」。

吾有一術。名之曰「取本位冪」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	注曰「「二進者方可施是術。」」
	施「絕對」於「甲」。名之曰「乙」。
	若「乙」小於「取位上溢限」者。
		乘「乙」以「取位常數甲」。名之曰「丙」。
		乘「丙」以「取位常數乙」。名之曰「丁」。
		減「丁」於「丙」。乃得矣。
	若非。
		乘「乙」以「下位冪」。乘其以「下位冪」。名之曰「丙」。
		若「丙」小於「取位上溢限」者。
			施「取本位冪」於「丙」。乘其以「上位冪」。乘其以「上位冪」。乃得矣。
		若非。
			乃得「乙」也。
	云云。
是謂「取本位冪」之術也。

吾有一術。名之曰「取內鄰數」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	注曰「「二進者方可施是術。」」
	乘「甲」以「取位常數乙」。名之曰「乙」。
	若「乙」不等於「甲」者。
		乃得「乙」也。
	若「甲」等於零者。
		乃得「甲」也。
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「丙」。
	若「丙」大於「至巨數」者。
		乘「符」於「至巨數」。乃得矣。云云。
	減「至微數」於「丙」。乘其以「符」。乃得矣。
是謂「取內鄰數」之術也。

吾有一術。名之曰「取外鄰數」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	注曰「「二進者方可施是術。」」
	施「正負」於「甲」。名之曰「符」。
	施「取本位冪」於「甲」。乘其以「下位冪」。乘其以「符」。加其以「甲」。名之曰「乙」。
	若「乙」不等於「甲」者。
		乃得「乙」也。
	若「甲」等於零者。
		乃得「至微數」也。
	乘「符」於「甲」。加其以「至微數」。乘其以「符」。乃得矣。
是謂「取外鄰數」之術也。

吾有一術。名之曰「分算」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	注曰「「分算者。其位上下二分。借二算布之也。」」
	吾有一列。名之曰「二算」。
	施「絕對」於「甲」。名之曰「乙」。
	若「乙」小於「分算上溢限甲」者。
		乘「甲」以「分算常數」。名之曰「丙」。
		減「丙」於「甲」。名之曰「丁」。
		加「丁」於「丙」。名之曰「上甲」。
		充「二算」以「上甲」。
		減「甲」以「上甲」。充「二算」以其。
	若非。
		若「乙」小於「分算上溢限乙」者。
			乘「甲」以「下位冪」。名之曰「丙」。
			施「分算」於「丙」。名之曰「丁」。
			凡「丁」中之「戊」。
				乘「戊」以「上位冪」。充「二算」以其。
			云云。
		若非。
			減「乙」以「分算上溢限乙」。名之曰「丙」。
			若「丙」小於「分算上溢限乙」者。
				施「正負」於「甲」。名之曰「符」。
				乘「符」於「分算上溢限乙」。充「二算」以其。
				乘「符」於「丙」。充「二算」以其。
			若非。
				充「二算」以「甲」。以「甲」。
			云云。
		云云。
	云云。
	乃得「二算」。
是謂「分算」之術也。

吾有一術。名之曰「造雙數」。欲行是術。必先得二數。曰「上」。曰「下」。乃行是術曰。
	注曰「「雙數者。以二算布一數。其位倍之。」」
	吾有一列。名之曰「雙」。充「雙」以「上」。以「下」。乃得「雙」。
是謂「造雙數」之術也。

吾有一術。名之曰「雙數取反」。欲行是術。必先得一列。曰「甲」。乃行是術曰。
	夫「甲」之一。乘其以負一。名之曰「上」。
	夫「甲」之二。乘其以負一。名之曰「下」。
	施「造雙數」於「上」。於「下」。乃得矣。
是謂「雙數取反」之術也。

吾有一術。名之曰「以小加大得雙」。欲行是術。必先得二數。曰「小」。曰「大」。乃行是術曰。
	注曰「「大小者。二數移位之大小也。或前小而後大。或同。不可反之。」」
	加「小」於「大」。名之曰「上和」。
	減「大」於「上和」。名之曰「丙」。
	減「丙」於「小」。名之曰「下和」。
	施「造雙數」於「上和」。於「下和」。乃得矣。
是謂「以小加大得雙」之術也。

吾有一術。名之曰「相加得雙」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」於「乙」。名之曰「上和」。
	減「乙」於「上和」。名之曰「丙」。
	減「丙」於「上和」。名之曰「丁」。
	減「丙」於「甲」。名之曰「戊」。
	減「丁」於「乙」。名之曰「己」。
	加「戊」於「己」。名之曰「下和」。
	施「造雙數」於「上和」。於「下和」。乃得矣。
是謂「相加得雙」之術也。

吾有一術。名之曰「加單於雙」。欲行是術。必先得一數。曰「甲」。一列。曰「乙」。乃行是術曰。
	夫「乙」之一。名之曰「上乙」。夫「乙」之二。名之曰「下乙」。
	施「相加得雙」於「甲」。於「上乙」。名之曰「丙」。
	夫「丙」之二。加其於「下乙」。夫「丙」之一。取二以施「以小加大得雙」。乃得矣。
是謂「加單於雙」之術也。

吾有一術。名之曰「以單減雙得單」。欲行是術。必先得一數。曰「甲」。一列。曰「乙」。是術曰。
	夫「乙」之一。名之曰「上乙」。夫「乙」之二。名之曰「下乙」。
	減「甲」於「上乙」。加其以「下乙」。乃得矣。
是謂「以單減雙得單」之術也。

吾有一術。名之曰「加雙於雙」。欲行是術。必先得二列。曰「甲」。曰「乙」。乃行是術曰。
	夫「甲」之一。夫「乙」之一。取二以施「相加得雙」。名之曰「丙」。
	夫「甲」之二。夫「乙」之二。取二以施「相加得雙」。名之曰「丁」。
	夫「丙」之一。名之曰「上丙」。
	夫「丙」之二。名之曰「下丙」。
	夫「丁」之一。加其於「下丙」。夫「上丙」。取二以施「以小加大得雙」。名之曰「戊」。
	夫「戊」之一。名之曰「上戊」。
	夫「戊」之二。名之曰「下戊」。
	夫「丁」之二。加其於「下戊」。夫「上戊」。取二以施「以小加大得雙」。乃得矣。
是謂「加雙於雙」之術也。

吾有一術。名之曰「自乘得雙」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	乘「甲」以「甲」。名之曰「上方」。
	施「分算」於「甲」。名之曰「分甲」。
	夫「分甲」之一。名之曰「上甲」。
	夫「分甲」之二。名之曰「下甲」。
	乘「上甲」於「上甲」。減其以「上方」。名之曰「丙」。
	乘「上甲」於「下甲」。乘其以二。加其於「丙」。名之曰「丁」。
	乘「下甲」於「下甲」。加其於「丁」。名之曰「下方」。
	施「造雙數」於「上方」。於「下方」。乃得矣。
是謂「自乘得雙」之術也。

吾有一術。名之曰「相乘得雙」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	乘「甲」以「乙」。名之曰「上積」。
	施「分算」於「甲」。名之曰「分甲」。
	夫「分甲」之一。名之曰「上甲」。
	夫「分甲」之二。名之曰「下甲」。
	施「分算」於「乙」。名之曰「分乙」。
	夫「分乙」之一。名之曰「上乙」。
	夫「分乙」之二。名之曰「下乙」。
	乘「上甲」於「上乙」。減其以「上積」。名之曰「丙」。
	乘「上甲」於「下乙」。加其於「丙」。名之曰「丁」。
	乘「下甲」於「上乙」。加其於「丁」。名之曰「戊」。
	乘「下甲」於「下乙」。加其於「戊」。名之曰「下積」。
	施「造雙數」於「上積」。於「下積」。乃得矣。
是謂「相乘得雙」之術也。

吾有一術。名之曰「乘單於雙」。欲行是術。必先得一數。曰「甲」。一列。曰「乙」。是術曰。
	夫「乙」之一。名之曰「上乙」。
	夫「乙」之二。名之曰「下乙」。
	施「相乘得雙」於「甲」於「上乙」。名之曰「丙」。
	乘「甲」於「下乙」。名之曰「丁」。
	夫「丙」之二。加其以「丁」。夫「丙」之一。取二以施「以小加大得雙」。乃得矣。
是謂「乘單於雙」之術也。

吾有一術。名之曰「雙數自乘」。欲行是術。必先得一列。曰「甲」。乃行是術曰。
	夫「甲」之一。名之曰「上甲」。
	夫「甲」之二。名之曰「下甲」。
	施「自乘得雙」於「上甲」。名之曰「乙」。
	乘「上甲」於「下甲」。乘其以二。名之曰「丙」。
	夫「乙」之二。加其以「丙」。夫「乙」之一。取二以施「以小加大得雙」。乃得矣。
是謂「雙數自乘」之術也。

吾有一術。名之曰「乘雙於雙」。欲行是術。必先得二列。曰「甲」。曰「乙」。是術曰。
	夫「甲」之一。名之曰「上甲」。
	夫「甲」之二。名之曰「下甲」。
	夫「乙」之一。名之曰「上乙」。
	夫「乙」之二。名之曰「下乙」。
	施「相乘得雙」於「上甲」於「上乙」。名之曰「丙」。
	乘「上甲」於「下乙」。名之曰「丁」。
	乘「下甲」於「上乙」。加其於「丁」。名之曰「戊」。
	夫「丙」之二。加其以「戊」。夫「丙」之一。取二以施「以小加大得雙」。乃得矣。
是謂「乘雙於雙」之術也。

吾有一術。名之曰「求多項式」。欲行是術。必先得一列。曰「式」。一數。曰「甲」。乃行是術曰。
	有數零。名之曰「解」。
	夫「式」之長。名之曰「引」。
	恆為是。
		若「引」等於零者。乃得「解」也。
		乘「解」以「甲」。名之曰「乙」。
		夫「式」之「引」。加其於「乙」。昔之「解」者。今其是矣。
		減一於「引」。昔之「引」者。今其是矣。
	云云。
是謂「求多項式」之術也。

注曰「「浮點移位。同Javascript之x * Math.pow(2, y), y is integer也。」」
今有一術。名之曰「浮點移位」。欲行是術。必先得二數。曰「本」。曰「位」。乃行是術曰。
	注曰「「位正則進位。負則退位。」」
	若「位」不大於「至大指」者。若「位」不小於「至小指」者。
		施「求進冪」於「位」。乘其於「本」。乃得矣。
	云云。云云。

	施「不可算數乎」於「本」。若其然者。
		乃得「本」也。
	施「不可算數乎」於「位」。若其然者。
		乃得「位」也。
	若「位」大於零者。
		加二於「位極差」。名之曰「限」。
		若「位」不大於「限」者。
			夫「本」。減「位」以「至大指」。取二以施「浮點移位」。乘其以「巨位冪」。乃得矣。云云。
		若「位」不大於「至巨數」者。
			夫「本」。減「限」以「至大指」。取二以施「浮點移位」。乘其以「巨位冪」。乃得矣。云云。
		若「本」不等於零者。
			施「正負」於「本」。取一以施「上溢」。乃得矣。
		若非。
			施「不可算」。乃得矣。
		云云。
	若非。
		減負二以「位極差」。名之曰「限」。
		若「位」不小於「限」者。
			夫「本」。減「位」以「至小指」。取二以施「浮點移位」。乘其以「微位冪」。乃得矣。云云。
		乘負一於「至巨數」。若「位」不小於其者。
			夫「本」。減「限」以「至小指」。取二以施「浮點移位」。乘其以「微位冪」。乃得矣。云云。
		施「絕對」於「本」。若其不大於「至巨數」者。
			乘「本」以「浮點零」。乃得矣。
		若非。
			施「不可算」。乃得矣。
		云云。
	云云。
是謂「浮點移位」之術也。

注曰「「析浮點數。同Javascript之N/A也。」」
今有一術。名之曰「析浮點數」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	注曰「「是術得一物。物有三數。曰符。曰位。曰本。符者。正負也。位者。進退位也。本者。本數也。」」
	注曰「「設計算機二進。若施是術於負六。乃得符負一。位二。本一又五分。」」
	吾有一術。名之曰「造析」。欲行是術。必先得三數。曰「符」。曰「位」。曰「本」。乃行是術曰。
		吾有一物。名之曰「析」。其物如是。
			物之「「符」」者。數曰「符」。
			物之「「位」」者。數曰「位」。
			物之「「本」」者。數曰「本」。
		是謂「析」之物也。
		乃得「析」。
	是謂「造析」之術也。

	吾有一術。名之曰「乘」。欲行是術。必先得二數。曰「丙」。曰「丁」。乃行是術曰。
		乘「丙」於「丁」。乃得矣。
	是謂「乘」之術也。

	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「乙」。
	若「甲」等於零者。
		夫「符」。施「除以零」於負一。夫「乙」。取三以施「造析」。乃得矣。云云。
	施「不可算數乎」於「甲」。若其然者。
		夫「符」。夫「甲」。夫「乙」。取三以施「造析」。乃得矣。云云。
	若「乙」大於「至巨數」者。
		夫「符」。夫「乙」。夫「乙」。取三以施「造析」。乃得矣。云云。

	若「乙」不小於一者。
		吾有一術。名之曰「據」。欲行是術。必先得一數。曰「丙」。乃行是術曰。
			乘「丙」以「進制」。若其大於「乙」者。乃得陽。若非。乃得陰也。
		是謂「據」之術也。
		夫「至大指」。夫「浮點一」。夫「進制」。夫「乘」。夫「據」。取五以施「試界」。名之曰「位表」。
		夫「位表」之「「引」」。名之曰「位」。
		夫「位表」之「「實」」。除其於「乙」。名之曰「本」。
		夫「符」。夫「位」。夫「本」。取三以施「造析」。乃得矣。
	若非。
		吾有一術。名之曰「據」。欲行是術。必先得一數。曰「丙」。乃行是術曰。
			若「丙」不大於「乙」者。乃得陽。若非。乃得陰也。
		是謂「據」之術也。
		減「至小指」於「總算位」。夫「浮點一」。夫「退制」。夫「乘」。夫「據」。取五以施「試界」。名之曰「位表」。
		夫「位表」之「「引」」。減其於零。名之曰「位」。
		夫「位表」之「「實」」。除其於「乙」。名之曰「本」。
		夫「符」。夫「位」。夫「本」。取三以施「造析」。乃得矣。
	云云。
是謂「析浮點數」之術也。

除「上位冪」以四。名之曰「整除大數限」。

注曰「「取底除。同Javascript之{ 商: Math.floor(x / y), 餘: x - y * quo }也。」」
今有一術。名之曰「取底除」。欲行是術。必先得二數曰「實」。曰「法」。是術曰。
	施「正負」於「法」。名之曰「法符」。乘「法」以「法符」。名之曰「法值」。乘「實」以「法符」。名之曰「乙」。
	施「正負」於「乙」。名之曰「乙符」。乘「乙」以「乙符」。名之曰「實值」。
	除「法值」於「實值」。所餘幾何。名之曰「餘」。
	減「餘」於「實值」。除其以「法值」。取一以施「取整」。名之曰「商」。
	若「乙符」小於零者。若「餘」不等於零者。
		減「商」於負一。昔之「商」者。今其是矣。
		減「餘」於「法值」。昔之「餘」者。今其是矣。
	云云。云云。
	吾有一物。名之曰「商餘」。其物如是。
		物之「「商」」者。數曰「商」。
		物之「「餘」」者。數曰「餘」。
	是謂「商餘」之物也。
	乃得「商餘」。
是謂「取底除」之術也。

注曰「「取整除。同Javascript之{ 商: Math.round(x / y), 餘: x - y * quo }也。」」
今有一術。名之曰「取整除」。欲行是術。必先得二數曰「實」。曰「法」。是術曰。
	施「正負」於「法」。名之曰「法符」。乘「法」以「法符」。名之曰「法值」。
	施「正負」於「實」。名之曰「實符」。乘「實」以「實符」。名之曰「實值」。
	乘「法符」於「實符」名之曰「符」。
	除「法值」於「實值」。所餘幾何。名之曰「餘」。
	減「餘」於「實值」。除其以「法值」。取一以施「取整」。名之曰「商」。
	除「法值」以二。若「餘」不小於其者。
		加「商」以一。昔之「商」者。今其是矣。
		減「餘」以「法值」。昔之「餘」者。今其是矣。
	云云。
	乘「商」以「符」。昔之「商」者。今其是矣。
	乘「餘」以「符」。昔之「餘」者。今其是矣。
	吾有一物。名之曰「商餘」。其物如是。
		物之「「商」」者。數曰「商」。
		物之「「餘」」者。數曰「餘」。
	是謂「商餘」之物也。
	乃得「商餘」。
是謂「取整除」之術也。

吾有一列。名之曰「半圓周率密率」。
	施「浮點移位」於八八四二七九七一九〇〇三五五五。於負四十九。充「半圓周率密率」以其。
	施「浮點移位」於四九六七七五七六〇〇〇二一五一一。於負一百零六。充「半圓周率密率」以其。

吾有一術。名之曰「分四象」。欲行是術。必先得二數曰「甲」。曰「上限」。是術曰。
	注曰「「甲須為有限非零數。」」
	注曰「「術尚不精。當以極密率除之。」」
	夫「甲」。夫「半圓周率密率」之一。取二以施「取整除」。名之曰「乙」。
	夫「乙」之「「商」」。名之曰「商」。夫「乙」之「「餘」」。名之曰「餘」。
	注曰「「半圓周率弧度即一象。」」
	施「絕對」於「商」。若其不小於「整除大數限」者。
		注曰「「商甚大。或算位不足而謬之。」」
		有數四。名之曰「移位」。
		夫「甲」。減零以「移位」。取二以施「浮點移位」。夫「上限」。取二以施「分四象」。
		夫其之「「角」」。夫「移位」。取二以施「浮點移位」。夫「上限」。取二以施「分四象」。乃得矣。
	云云。
	施「取底除」於「商」。於四。夫其之「「餘」」。名之曰「象」。
	夫「半圓周率密率」之二。乘其以「商」。減其於「餘」。昔之「餘」者。今其是矣。
	施「絕對」於「餘」。若其大於「上限」者。
		施「分四象」於「餘」。於「上限」。名之曰「解」。
		夫「解」之「「象」」。加其於「象」。夫四。取二以施「取底除」。
		夫其之「「餘」」。昔之「解」之「「象」」者。今其是矣。
		乃得「解」。
	若非。
		吾有一物。名之曰「解」。其物如是。
			物之「「角」」者。數曰「餘」。
			物之「「象」」者。數曰「象」。
		是謂「解」之物也。
		乃得「解」。
	云云。
是謂「分四象」之術也。

有數七分九釐。名之曰「正餘弦角限」。注曰「「略大於四十五度。」」

吾有一列。名之曰「正弦多項式」。
	除負一以六。充「正弦多項式」以其。
	除一以一二〇。充「正弦多項式」以其。
	除負一以五〇四〇。充「正弦多項式」以其。
	除一以三六二八八〇。充「正弦多項式」以其。
	除負一以三九九一六八〇〇。充「正弦多項式」以其。
	除一以六二二七〇二〇八〇〇。充「正弦多項式」以其。
	除負一以一三〇七六七四三六八〇〇〇。充「正弦多項式」以其。
	除一以三五五六八七四二八〇九六〇〇〇。充「正弦多項式」以其。

吾有一列。名之曰「餘弦多項式」。
	除負一以二。充「餘弦多項式」以其。
	除一以二四。充「餘弦多項式」以其。
	除負一以七二〇。充「餘弦多項式」以其。
	除一以四〇三二〇。充「餘弦多項式」以其。
	除負一以三六二八八〇〇。充「餘弦多項式」以其。
	除一以四七九〇〇一六〇〇。充「餘弦多項式」以其。
	除負一以八七一七八二九一二〇〇。充「餘弦多項式」以其。
	除一以二〇九二二七八九八八八〇〇〇。充「餘弦多項式」以其。

注曰「「正弦。同Javascript之Math.sin也。」」
今有一術。名之曰「正弦」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「數小甚矣。乃得其身。否則以泰勒展開求之。復以週期性得其餘。」」

	施「絕對」於「甲」。名之曰「乙」。
	若「乙」小於「下位冪」者。
		乃得「甲」也。
	若「乙」小於「正餘弦角限」者。
		乘「甲」於「甲」。名之曰「二次冪」。
		施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「甲」。加其於「甲」。乃得矣。云云。
	若「乙」不大於「至巨數」者。
		施「分四象」於「甲」。於「正餘弦角限」。名之曰「丙」。
		夫「丙」之「「角」」。名之曰「丁」。夫「丙」之「「象」」。名之曰「象」。
		乘「丁」於「丁」。名之曰「二次冪」。
		若「象」等於零者。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。乃得矣。云云。
		若「象」等於一者。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乃得矣。云云。
		若「象」等於二者。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。
			乘其以負一。乃得矣。云云。
		若「象」等於三者。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乃得矣。云云。
	云云。
	施「不可算數乎」於「甲」。若其然者。
		乃得「甲」也。
	施「不可算」。乃得矣。
是謂「正弦」之術也。

注曰「「餘弦。同Javascript之Math.cos也。」」
今有一術。名之曰「餘弦」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「餘弦者。蓋正弦之變化所得。」」

	施「絕對」於「甲」。名之曰「乙」。
	若「乙」小於「下位冪」者。
		乃得一也。
	若「乙」小於「正餘弦角限」者。
		乘「甲」於「甲」。名之曰「二次冪」。
		施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其以一。乃得矣。云云。
	若「乙」不大於「至巨數」者。
		施「分四象」於「甲」。於「正餘弦角限」。名之曰「丙」。
		夫「丙」之「「角」」。名之曰「丁」。夫「丙」之「「象」」。名之曰「象」。
		乘「丁」於「丁」。名之曰「二次冪」。
		若「象」等於零者。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。乃得矣。云云。
		若「象」等於一者。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。
			乘其以負一。乃得矣。云云。
		若「象」等於二者。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。乃得矣。云云。
		若「象」等於三者。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。乃得矣。云云。
	云云。
	施「不可算數乎」於「甲」。若其然者。
		乃得「甲」也。
	施「不可算」。乃得矣。
是謂「餘弦」之術也。

吾有一列。名之曰「反正弦多項式」。
	充「反正弦多項式」以〇·一六六六六六六六六六六六六六六四六。
	充「反正弦多項式」以〇·〇七五〇〇〇〇〇〇〇〇〇二三一八五三。
	充「反正弦多項式」以〇·〇四四六四二八五七〇九九五一八七七六。
	充「反正弦多項式」以〇·〇三〇三八一九四七六一二五八八一八八。
	充「反正弦多項式」以〇·〇二二三七二〇三九七二四〇六七九九六。
	充「反正弦多項式」以〇·〇一七三五五四〇八四二九六九九一六八。
	充「反正弦多項式」以〇·〇一三九二七九一六二七八〇七六一四〇。
	充「反正弦多項式」以〇·〇一一八八八五三〇五一〇五三八八〇九。
	充「反正弦多項式」以〇·〇〇七七四〇一二四四一八〇六六九〇三三。
	充「反正弦多項式」以〇·〇一六二二三四二二六二三一八二五六二。
	充「反正弦多項式」以負〇·〇一一〇六六五二一五七八〇七三九七〇。
	充「反正弦多項式」以〇·〇二八四〇〇七四九二〇一四五一九六二。

注曰「「反正弦。同Javascript之Math.asin也。」」
今有一術。名之曰「反正弦」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「小於五分者。以多項式求之。其餘以三角恆等式變化可得。」」
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「乙」。
	有爻陽。名之曰「非常」。
	若「乙」大於零者。若「乙」不大於一者。
		昔之「非常」者。今陰是矣。
	云云。云云。
	若「非常」者。
		若「甲」等於零者。乃得「甲」也。
		施「不可算數乎」於「甲」。若其然者。乃得「甲」也。
		施「不可算」。乃得矣。
	云云。

	若「乙」大於五分者。
		減「乙」於一。除其以二。名之曰「丙」。
		施「平方根」於「丙」。乘其以二。名之曰「丁」。
		施「求多項式」於「反正弦多項式」。於「丙」。乘其以「丙」。乘其以「丁」。加其以「丁」。名之曰「戊」。
		夫「半圓周率密率」之二。減其以「戊」。名之曰「己」。
		夫「半圓周率密率」之一。加其於「己」。乘其以「符」。乃得矣。
	若非。
		乘「乙」於「乙」。名之曰「丙」。
		施「求多項式」於「反正弦多項式」。於「丙」。乘其以「丙」。乘其以「甲」。加其於「甲」。乃得矣。
	云云。
是謂「反正弦」之術也。

注曰「「反餘弦。同Javascript之Math.acos也。」」
今有一術。名之曰「反餘弦」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「反餘弦者。蓋反正弦之變化所得。」」
	施「絕對」於「甲」。名之曰「乙」。
	有爻陽。名之曰「非常」。
	若「乙」不大於一者。
		昔之「非常」者。今陰是矣。
	云云。
	若「非常」者。
		施「不可算數乎」於「甲」。若其然者。乃得「甲」也。
		施「不可算」。乃得矣。
	云云。

	若「乙」大於五分者。
		減「乙」於一。除其以二。名之曰「丙」。
		施「平方根」於「丙」。乘其以二。名之曰「丁」。
		施「求多項式」於「反正弦多項式」。於「丙」。乘其以「丙」。乘其以「丁」。加其以「丁」。名之曰「戊」。
		若「甲」大於零者。
			乃得「戊」。
		若非。
			夫「半圓周率密率」之二。乘其以二。減其以「戊」。名之曰「己」。
			夫「半圓周率密率」之一。乘其以二。加其於「己」。乃得矣。
		云云。
	若非。
		乘「乙」於「乙」。名之曰「丙」。
		施「求多項式」於「反正弦多項式」。於「丙」。乘其以「丙」。乘其以「甲」。加其於「甲」。名之曰「戊」。
		夫「半圓周率密率」之二。減其以「戊」。名之曰「己」。
		夫「半圓周率密率」之一。加其於「己」。乃得矣。
	云云。
是謂「反餘弦」之術也。

注曰「「正切。同Javascript之Math.tan也。」」
今有一術。名之曰「正切」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「數小甚矣。乃得其身。其餘或以三角恆等式。或以週期性可得。」」

	施「絕對」於「甲」。名之曰「乙」。
	若「乙」小於「下位冪」者。
		乃得「甲」也。
	若「乙」小於「正餘弦角限」者。
		乘「甲」於「甲」。名之曰「二次冪」。
		施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「甲」。加其於「甲」。名之曰「勾」。
		施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其以一。名之曰「股」。
		除「勾」以「股」。乃得矣。云云。
	若「乙」不大於「至巨數」者。
		施「分四象」於「甲」。於「正餘弦角限」。名之曰「丙」。
		夫「丙」之「「角」」。名之曰「丁」。夫「丙」之「「象」」。名之曰「象」。
		乘「丁」於「丁」。名之曰「二次冪」。
		若「象」等於零者。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。名之曰「勾」。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。名之曰「股」。
			除「勾」以「股」。乃得矣。云云。
		若「象」等於一者。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。加其於一。名之曰「勾」。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。
			乘其以負一。名之曰「股」。
			除「勾」以「股」。乃得矣。云云。
		若「象」等於二者。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。
			乘其以負一。名之曰「勾」。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。名之曰「股」。
			除「勾」以「股」。乃得矣。云云。
		若「象」等於三者。
			施「求多項式」於「餘弦多項式」。於「二次冪」。乘其以「二次冪」。減其於負一。名之曰「勾」。
			施「求多項式」於「正弦多項式」。於「二次冪」。乘其以「二次冪」。乘其以「丁」。加其於「丁」。名之曰「股」。
			除「勾」以「股」。乃得矣。云云。
	云云。
	施「不可算數乎」於「甲」。若其然者。
		乃得「甲」也。
	施「不可算」。乃得矣。
是謂「正切」之術也。

吾有一列。名之曰「反正切多項式」。
	充「反正切多項式」以負〇·三三三三三三三三三三三三三三三二六。
	充「反正切多項式」以〇·一九九九九九九九九九九九九二二六八。
	充「反正切多項式」以負〇·一四二八五七一四二八四二一〇九五七。
	充「反正切多項式」以〇·一一一一一一一〇九九六五六八一〇三。
	充「反正切多項式」以負〇·〇九〇九〇九〇四五七三六一九二八〇九。
	充「反正切多項式」以〇·〇七六九二二〇二二一一〇八五〇六九六。
	充「反正切多項式」以負〇·〇六六六五〇九六二七三七〇九三七五五。
	充「反正切多項式」以〇·〇五八六六八一九一二四六一七二三一三。
	充「反正切多項式」以負〇·〇五一五九〇五五四五〇八四〇七四八七。
	充「反正切多項式」以〇·〇四二八八一四六一二三五七三四五六〇。
	充「反正切多項式」以負〇·〇二九〇三〇一七〇一六〇九七五七五一。
	充「反正切多項式」以〇·〇一一二〇八四九一一九三〇八七七九二。

注曰「「反正切。同Javascript之Math.atan也。」」
今有一術。名之曰「反正切」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「小於五分者。以多項式求之。其餘以三角恆等式變化可得。」」
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「乙」。
	有爻陽。名之曰「非常」。
	若「乙」大於零者。若「乙」不大於「至巨數」者。
		昔之「非常」者。今陰是矣。
	云云。云云。
	若「非常」者。
		若「乙」等於零者。乃得「甲」也。
		若「乙」大於「至巨數」者。乘「符」於「半圓周率」。乃得矣。云云。
		乃得「甲」。
	云云。

	若「乙」小於五分者。
		乘「乙」於「乙」。名之曰「丙」。
		施「求多項式」於「反正切多項式」。於「丙」。乘其以「丙」。乘其以「甲」。加其於「甲」。乃得矣。
	或若「乙」大於二者。
		除「乙」於一。名之曰「丁」。
		乘「丁」於「丁」。名之曰「丙」。
		施「求多項式」於「反正切多項式」。於「丙」。乘其以「丙」。乘其以「丁」。加其於「丁」。名之曰「戊」。
		夫「半圓周率密率」之二。減其以「戊」。名之曰「己」。
		夫「半圓周率密率」之一。加其於「己」。乘其以「符」。乃得矣。
	若非。
		減「乙」以一。名之曰「庚」。加「乙」於一。除其於「庚」。名之曰「丁」。
		乘「丁」於「丁」。名之曰「丙」。
		施「求多項式」於「反正切多項式」。於「丙」。乘其以「丙」。乘其以「丁」。加其於「丁」。名之曰「戊」。
		夫「半圓周率密率」之二。除其以二。加其於「戊」。名之曰「己」。
		夫「半圓周率密率」之一。除其以二。加其於「己」。乘其以「符」。乃得矣。
	云云。
是謂「反正切」之術也。


注曰「「勾股求角。同Javascript之Math.atan2也。」」
今有一術。名之曰「勾股求角」。欲行是術。必先得二數曰「甲」。曰「乙」。乃行是術曰。
	注曰「「反正切之分類討論也」」
	施「絕對」於「甲」。若其大於「至巨數」者。
		施「絕對」於「乙」。若其大於「至巨數」者。
			施「正負」於「甲」。施「正負」於「乙」。取二以施「勾股求角」。乃得矣。
		云云。
	云云。

	若「乙」等於零者。
		若「甲」大於零者。乃得「半圓周率」也。
		若「甲」小於零者。減零以「半圓周率」乃得其也。
		乃得零也。

	除「甲」以「乙」。取一以施「反正切」。名之曰「丙」。
	若「乙」大於零者。乃得「丙」也。
	若「甲」不小於零者。加「丙」以「圓周率」。乃得矣。云云。

	減「丙」以「圓周率」。乃得矣。

是謂「勾股求角」之術也。


除五〇六二九七三以二〇九七一五二。名之曰「勾股求弦常數上」。
有數負〇·〇〇〇〇〇〇〇九五〇〇六〇五五三四一八二三三一一二七五七九〇三〇一九二一四三〇三二八一二四六二。
	名之曰「勾股求弦常數下」。
注曰「「加二之平方根於一也。」」

注曰「「勾股求弦。同Javascript之Math.hypot也。」」
今有一術。名之曰「勾股求弦」。欲行是術。必先得二數曰「勾」。曰「股」。乃行是術曰。
	施「絕對」於「勾」。名之曰「甲」。
	施「絕對」於「股」。名之曰「乙」。
	若「甲」等於零者。乃得「乙」也。
	若「乙」等於零者。乃得「甲」也。
	若「甲」大於「至巨數」者。乃得「甲」也。
	若「乙」大於「至巨數」者。乃得「乙」也。
	施「不可算數乎」於「甲」。若其然者。乃得「甲」也。
	施「不可算數乎」於「乙」。若其然者。乃得「乙」也。
	若「乙」大於「甲」者。
		有數「甲」。名之曰「借」。
		昔之「甲」者。今「乙」是矣。
		昔之「乙」者。今「借」是矣。
	云云。

	減「乙」於「甲」。名之曰「丙」。
	若「丙」等於「甲」者。
		乃得「甲」。
	或若「丙」大於「乙」者。
		除「乙」於「甲」。名之曰「丁」。
		乘「丁」於「丁」。加其於一。取一以施「平方根」。加其於「丁」。
		除其於「乙」。加其於「甲」。乃得矣。
	若非。
		除「乙」於「丙」。名之曰「戊」。
		加「戊」於二。乘其以「戊」。名之曰「己」。
		加「己」於二。取一以施「平方根」。加其於「二之平方根」。除其於「己」。名之曰「庚」。
		加「庚」於「勾股求弦常數下」。加其於「戊」。加其於「勾股求弦常數上」。
		除其於「乙」。加其於「甲」。乃得矣。
	云云。
是謂「勾股求弦」之術也。

除一百四十五萬三千六百三十五以二百零九萬七千一百五十二。名之曰「二之對數上」。
有數負〇·〇〇〇〇〇〇〇〇一九〇四六五四二九九九五七七六七八七八五四一八二三四三一九二四四九九八六五六四〇。
	名之曰「二之對數下」。

吾有一列。名之曰「對數多項式甲」。
	除一以三。充「對數多項式甲」以其。
	除一以五。充「對數多項式甲」以其。
	除一以七。充「對數多項式甲」以其。
	除一以九。充「對數多項式甲」以其。
	除一以十一。充「對數多項式甲」以其。
	除一以十三。充「對數多項式甲」以其。
	除一以十五。充「對數多項式甲」以其。
	除一以十七。充「對數多項式甲」以其。
	除一以十九。充「對數多項式甲」以其。
注曰「「 x^2 * f(x^2) = atanh(x)/x - 1 」」

注曰「「對數。同Javascript之Math.log也。」」
今有一術。名之曰「對數」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「自然對數。」」
	有爻陽。名之曰「非常」。
	若「甲」大於零者。若「甲」不大於「至巨數」者。
		昔之「非常」者。今陰是矣。
	云云。云云。
	若「非常」者。
		若「甲」等於零者。
			施「除以零」於負一。乃得矣。云云。
		若「甲」小於零者。
			施「不可算」。乃得矣。云云。
		乃得「甲」。
	云云。

	注曰「「以對數屬性佐泰勒展開」」
	施「析浮點數」於「甲」。名之曰「析甲」。
	夫「析甲」之「「位」」。名之曰「位」。
	夫「析甲」之「「本」」。名之曰「本」。
	若「本」大於「二之平方根」者。
		加一於「位」。昔之「位」者。今其是矣。
		除二於「本」。昔之「本」者。今其是矣。
	云云。
	乘「二之對數」於「位」。名之曰「乙」。
	減「本」以一。名之曰「分子」。加「本」以一。除其於「分子」。名之曰「丙」。
	乘「丙」以「丙」。名之曰「二次冪」。
	施「求多項式」於「對數多項式甲」。於「二次冪」。乘其以「二次冪」。乘其以「丙」。加其於「丙」。
	乘其以二。加其以「乙」。乃得矣。

是謂「對數」之術也。

加二於「至大指」。乘其以「二之對數」。名之曰「指數上溢限」。
減「至小指」以「總算位」。減其以一。乘其以「二之對數」。名之曰「指數下溢限」。

吾有一列。名之曰「指數多項式甲」。
	除一以三。充「指數多項式甲」以其。
	除負一以四十五。充「指數多項式甲」以其。
	除二以九百四十五。充「指數多項式甲」以其。
	除負一以四千七百二十五。充「指數多項式甲」以其。
	除二以九萬三千五百五十五。充「指數多項式甲」以其。
	除負一千三百八十二以六億三千八百五十一萬二千八百七十五。充「指數多項式甲」以其。
注曰「「 x^2 * f(x^2) = x/tanh(x) - 1 」」

注曰「「指數。同Javascript之Math.exp也。」」
今有一術。名之曰「指數」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	注曰「「自然指數。」」
	有爻陽。名之曰「非常」。
	若「甲」小於「指數上溢限」者。若「甲」大於「指數下溢限」者。
		昔之「非常」者。今陰是矣。
	云云。云云。
	若「非常」者。
		施「不可算數乎」於「甲」。若其然者。
			乃得「甲」也。
		若「甲」大於零者。
			若「甲」大於「至巨數」者。
				乃得「甲」。
			若非。
				施「上溢」於一。乃得矣。
			云云。
		若非。
			乘負一於「至巨數」。若「甲」小於其者。
				乃得「浮點零」。
			若非。
				施「下溢」於一。乃得矣。
			云云。
		云云。
	云云。

	除「甲」以「二之對數」。取一以施「取整」。名之曰「移位數」。
	乘「二之對數上」於「移位數」。減其於「甲」。名之曰「乙」。
	乘「二之對數下」於「移位數」。減其於「乙」。名之曰「丙」。
	注曰「「除二之對數於甲。其餘者丙。以密率求之。」」
	除二於「丙」。名之曰「丁」。
	乘「丁」於「丁」。名之曰「戊」。
	施「求多項式」於「指數多項式甲」。於「戊」。乘其以「戊」。減其於「丁」。名之曰「己」。
	減「己」於一。除其於「丙」。加其於一。名之曰「庚」。
	施「浮點移位」於「庚」。於「移位數」。乃得矣。
是謂「指數」之術也。

吾有一列。名之曰「對數多項式乙上」。充「對數多項式乙上」。
	以〇·三三三三一七二四二二九四七八五六五三九一一〇五。
	以〇·二〇四三一三三七三七九六七九〇〇七〇九三五三六。
吾有一列。名之曰「對數多項式乙下」。充「對數多項式乙下」。
	以〇·〇〇〇〇一六〇九一〇三八五四七六七九四三一。
	以負〇·〇〇四三一三三七三七九六七九〇一〇六七。
	以〇·一四二八五七一四二八五七一七六四六。
	以〇·一一一一一一一一一〇九九二五〇七五。
	以〇·〇九〇九〇九〇九二九八八二一八〇一八。
	以〇·〇七六九二二八七三三〇三六九五五四四。
	以〇·〇六六六七八三二一八五七九三二五一五。
	以〇·〇五八四三七二六四一三一四六七八六七。
	以〇·〇五九四四三八八四三七八七五一四八四。
注曰「「 x^2 * (f0(x^2) + f1(x^2)) = atanh(x)/x - 1 」」

吾有一術。名之曰「正數之冪」。欲行是術。必先得二數。曰「底」。曰「指」。是術曰。
	注曰「「底為有限正數。指為有限數。」」

	注曰「「以下求底之對數。」」
	施「析浮點數」於「底」。名之曰「析底」。
	夫「析底」之「「位」」。名之曰「位」。
	夫「析底」之「「本」」。名之曰「本」。
	若「本」大於「二之平方根」者。
		加一於「位」。昔之「位」者。今其是矣。
		除二於「本」。昔之「本」者。今其是矣。
	云云。
	減「本」以一。名之曰「丙」。
	加「本」以一。名之曰「丁」。
	除「丁」於「丙」。名之曰「戊」。
	夫「戊」。夫「戊」。夫「本」。取二以施「相乘得雙」。取二以施「加單於雙」。名之曰「己」。
	夫「丙」。夫「己」。取二以施「以單減雙得單」。乘其以負一。除其以「丁」。
		夫「戊」。取二以施「以小加大得雙」。名之曰「庚」。
	施「雙數自乘」於「庚」。名之曰「辛」。
	夫「對數多項式乙下」。夫「辛」之一。取二以施「求多項式」。
		夫「對數多項式乙上」之二。夫「辛」。取二以施「乘單於雙」。取二以施「加單於雙」。名之曰「壬」。
	夫「對數多項式乙上」之一。夫「壬」。取二以施「加單於雙」。夫「辛」。取二以施「乘雙於雙」。
		夫「庚」。取二以施「乘雙於雙」。夫「庚」。取二以施「加雙於雙」。名之曰「癸」。
	夫「癸」之一。乘其以二。乘「位」於「二之對數上」。取二以施「相加得雙」。名之曰「子」。
	夫「癸」之二。乘其以二。名之曰「丑」。
	夫「子」之二。加其以「丑」。名之曰「寅」。
	乘「位」於「二之對數下」。加其以「寅」。夫「子」之一。取二以施「以小加大得雙」。名之曰「底之對數」。

	注曰「「以下求冪之對數。」」
	夫「底之對數」之一。乘其以「指」。名之曰「卯」。
	若「卯」大於「指數上溢限」者。施「上溢」於一。乃得矣。
	或若「卯」小於「指數下溢限」者。施「下溢」於一。乃得矣。云云。

	夫「指」。夫「底之對數」。取二以施「乘單於雙」。名之曰「冪之對數」。
	夫「冪之對數」之一。除其以「二之對數」。取一以施「取整」。名之曰「移位數」。
	乘「移位數」以「二之對數下」。乘「移位數」以「二之對數上」。取二以施「以小加大得雙」。
		取一以施「雙數取反」。夫「冪之對數」。取二以施「加雙於雙」。名之曰「辰」。
	夫「辰」之一。取一以施「指數」。夫「移位數」。取二以施「浮點移位」。乃得矣。
是謂「正數之冪」之術也。

注曰「「冪。同Javascript之Math.pow也。」」
今有一術。名之曰「冪」。欲行是術。必先得二數。曰「底」。曰「指」。乃行是術曰。
	若「指」等於零者。乃得一。
	或若「指」等於一者。乃得「底」。
	或若「指」等於二者。乘「底」於「底」。乃得矣。
	或若「指」等於負一者。除「底」於一。乃得矣。
	或若「指」等於五分者。施「平方根」於「底」。乃得矣。
	或若「指」等於三者。乘「底」於「底」。乘其於「底」。乃得矣。
	或若「指」等於負二者。除「底」於一。除其以「底」。乃得矣。
	或若「指」等於負五分者。施「平方根」於「底」。除其於一。乃得矣。
	云云。

	若「底」等於一者。乃得一也。

	施「不可算數乎」於「底」。若其然者。乃得「底」也。
	施「不可算數乎」於「指」。若其然者。乃得「指」也。

	施「絕對」於「底」。名之曰「甲」。
	施「絕對」於「指」。名之曰「乙」。
	若「乙」大於「至巨數」者。
		若「甲」等於一者。
			乃得一。
		或若「甲」小於一者。
			若「指」大於零者。乃得「浮點零」。
			若非。乃得「乙」也。
		若非。
			若「指」大於零者。乃得「乙」。
			若非。乃得「浮點零」也。
		云云。
	云云。

	吾有三爻。名之曰「指為偶數」。曰「指為奇數」。曰「指非整數」。
	除二於「乙」。所餘幾何。名之曰「丙」。
	若「丙」等於零者。昔之「指為偶數」者。今陽是矣。
	或若「丙」等於一者。昔之「指為奇數」者。今陽是矣。
	若非。昔之「指非整數」者。今陽是矣。
	云云。

	若「底」等於零者。
		若「指」小於零者。
			若「指為奇數」者。除「底」於一。乃得矣。
			若非。除「甲」於一。乃得矣。云云。
		若非。
			若「指為奇數」者。乃得「底」。
			若非。乃得「甲」也。
		云云。
	或若「甲」大於「至巨數」者。
		若「指」小於零者。
			若「指為奇數」者。施「正負」於「底」。乘其於「浮點零」。乃得矣。
			若非。乃得「浮點零」也。
		若非。
			若「指為奇數」者。乃得「底」。
			若非。乃得「甲」也。
		云云。
	或若「底」小於零者。
		若「指非整數」者。
			施「不可算」。乃得矣。
		或若「指為奇數」者。
			施「正數之冪」於「甲」於「指」。乘其以負一。乃得矣。
		云云。
	云云。

	施「正數之冪」於「甲」於「指」。乃得矣。
是謂「冪」之術也。

有數四分一釐七毫三絲一忽九微。名之曰「平方根常數甲」。
注曰「「 (2^0.5 - 1) * sqrt((2^0.25 + 2^-0.25) / 2) 」」
減一於「二之平方根」。乘其以二。名之曰「平方根常數乙」。
乘「上位冪」於「微位冪」。乘其以「進制」。乘其以「進制」。名之曰「平方根下溢界」。

注曰「「平方根。同Javascript之Math.sqrt也。」」
今有一術。名之曰「平方根」。欲行是術。必先得一數曰「甲」。乃行是術曰。
	有爻陽。名之曰「非常」。
	若「甲」不小於「平方根下溢界」者。若「甲」小於「巨位冪」者。
		昔之「非常」者。今陰是矣。
	云云。云云。
	若「非常」者。
		若「甲」等於零者。
			乃得「浮點零」也。
		施「不可算數乎」於「甲」。若其然者。
			乃得「甲」也。
		若「甲」大於「至巨數」者。
			乃得「甲」也。
		若「甲」小於零者。
			施「不可算」。乃得矣。云云。
		若「甲」不大於「平方根下溢界」者。
			乘「甲」以「上位冪」。乘其以「上位冪」。乘其以「進制」。乘其以「進制」。取一以施「平方根」。
			乘其以「下位冪」。乘其以「退制」。乃得矣。
		云云。
		若「甲」不小於「巨位冪」者。
			乘「甲」以「退制」。乘其以「退制」。取一以施「平方根」。
			乘其以「進制」。乃得矣。
		云云。
	云云。

	施「析浮點數」於「甲」。名之曰「析甲」。
	夫「析甲」之「「位」」。除其以二。名之曰「半位」。
	施「取底」於「半位」。名之曰「整半位」。
	夫「析甲」之「「本」」。加其以「二之平方根」。乘其以「平方根常數甲」。名之曰「丁」。
	減「半位」以「整半位」。乘其以「平方根常數乙」。加其以一。乘其以「丁」。名之曰「戊」。
	施「求進冪」於「整半位」。名之曰「己」。
	乘「己」於「戊」。名之曰「乙」。
	注曰「「以上求疏根」」

	批曰「「蓋用牛頓法耳」」
	為是三遍。
		除「甲」以「乙」。加其以「乙」。除其以二。名之曰「丙」。
		昔之「乙」者。今「丙」是矣。
	云云。

	注曰「「以下校末位。」」
	乘「己」以「下位冪」。名之曰「庚」。
	減「庚」於「乙」。名之曰「下數」。
	施「相乘得雙」於「乙」。於「下數」。名之曰「下積」。
	夫「下積」之一。若其大於「甲」者。
		乃得「下數」也。
	夫「下積」之一。若其等於「甲」者。夫「下積」之二。若其不小於零者。
		乃得「下數」。
	云云。云云。
	注曰「「若甲等於中數乘下數者。其平方根不足下半間數。捨餘得下數也。」」

	加「庚」於「乙」。名之曰「上數」。
	施「相乘得雙」於「乙」。於「上數」。名之曰「上積」。
	夫「上積」之一。若其小於「甲」者。
		乃得「上數」也。
	夫「上積」之一。若其等於「甲」者。夫「上積」之二。若其小於零者。
		乃得「上數」。
	云云。云云。
	注曰「「若甲等於中數乘上數者。其平方根不足上半間數。捨餘得中數也。」」

	乃得「乙」。
是謂「平方根」之術也。

注曰「「絕對。同Javascript之Math.abs也。」」
今有一術。名之曰「絕對」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。乃得矣。
是謂「絕對」之術也。

注曰「「取頂。同Javascript之Math.ceil也。」」
今有一術。名之曰「取頂」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	乘負一於「甲」。取一以施「取底」。乘其以負一。乃得矣。
是謂「取頂」之術也。

注曰「「取底。同Javascript之Math.floor也。」」
今有一術。名之曰「取底」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「乙」。
	注曰「「JavaScript者。除負以正。所餘負也。Python者。除負以正。所餘正也。」」
	除「乙」以一。所餘幾何。名之曰「丙」。
	若「丙」大於零者。
		減「丙」於「乙」。乘其以「符」。名之曰「丁」。
		若「符」小於零者。
			減一於「丁」。乃得矣。
		若非。
			乃得「丁」也。
	若非。
		乃得「甲」也。
是謂「取底」之術也。

注曰「「取整。同Javascript之Math.round, but rounded away from zero when the fractional part is exactly 0.5也。」」
今有一術。名之曰「取整」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「乙」。
	除「乙」以一。所餘幾何。名之曰「丙」。
	若「丙」等於「丙」者。
		若「丙」小於五分者。
			減「丙」於「乙」。乘其以「符」。乃得矣。
		若非。
			減「丙」於「乙」。加其以一。乘其以「符」。乃得矣。
		云云。
	若非。
		乃得「甲」也。
是謂「取整」之術也。

注曰「「捨餘。同Javascript之Math.trunc也。」」
今有一術。名之曰「捨餘」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	施「正負」於「甲」。名之曰「符」。乘「符」於「甲」。名之曰「乙」。
	除「乙」以一。所餘幾何。名之曰「丙」。
	若「丙」等於「丙」者。
		減「丙」於「乙」。乘其以「符」。乃得矣。
	若非。
		乃得「甲」也。
是謂「捨餘」之術也。

注曰「「正負。同Javascript之Math.sign也。」」
今有一術。名之曰「正負」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
	若「甲」大於零者。乃得一也。
	若「甲」小於零者。乃得負一也。
	乃得「甲」。
是謂「正負」之術也。


================================================
FILE: lib/籌經.wy
================================================
注曰「「求和。同Javascript之reduce((a,b)=>a+b)也。」」
今有一術。名之曰「求和」。欲行是術。必先得一列。曰「列」。乃行是術曰。
吾有一數。曰零。名之曰「和」。凡「列」中之「數」。加「和」以「數」。
昔之「和」者,今其是也。乃得「和」。是謂「求和」之術也。

今有一術。名之曰「算術平均」。欲行是術。必先得一列。曰「列」。乃行是術曰。
施「求和」於「列」。名之曰「和」。夫「列」之長。名之曰「長」。除「和」以「長」。
名之曰「算術平均數」。乃得「算術平均數」。是謂「算術平均」之術也。

今有一術。名之曰「方差」。欲行是術。必先得一列。曰「列」。乃行是術曰。
施「算術平均」於「列」。名之曰「算術平均數」。夫「列」之長。名之曰「長」。
吾有一數。曰零。名之曰「平方和」。凡「列」中之「數」。減「數」以「算術平均數」。
名之曰「偏差」。乘「偏差」以「偏差」。名之曰「偏差之平方」。
加「偏差之平方」以「平方和」。名之曰「平方和」。云云。除「平方和」以「長」。
名之曰「方差之數」。乃得「方差之數」。是謂「方差」之術也。


================================================
FILE: netlify.toml
================================================
[[headers]]
  for = "/__migrate__"
    [headers.values]
      Access-Control-Allow-Origin = "https://ide.wy-lang.org"

================================================
FILE: package.json
================================================
{
  "name": "wenyanlang",
  "description": "文言 A programming language for the ancient Chinese",
  "version": "0.4.0",
  "author": "LingDong <lingdong0618@hotmail.com>",
  "private": true,
  "repository": {
    "type": "git",
    "url": "https://github.com/wenyan-lang/wenyan.git"
  },
  "license": "MIT",
  "keywords": [
    "wenyan",
    "wenyan-lang",
    "compiler",
    "ancient-chinese",
    "classical-chinese"
  ],
  "homepage": "https://github.com/wenyan-lang/wenyan",
  "scripts": {
    "build": "npm run clear && npm run build:type && webpack --mode production",
    "build:dev": "npm run clear && npm run build:type && webpack --mode development",
    "build:site": "webpack --mode production --config webpack.site.config.js",
    "build:docs": "node ./tools/make_examples_readme.js",
    "build:wiki": "node ./tools/wiki/update.js",
    "build:type": "tsc --emitDeclarationOnly --declaration --declarationDir ./typings",
    "dev:site": "webpack --mode development --config webpack.site.config.js --watch",
    "dev": "npm run clear && npm run build:type && webpack --mode development --watch",
    "cli": "ts-node ./src/cli.ts",
    "clear": "rimraf dist typings",
    "publish": "bump --commit && node ./tools/publish.js",
    "publish:ci": "node ./tools/publish.js",
    "update:wiki": "node ./tools/wiki/update.js --push",
    "release": "bump --commit --tag && git push --follow-tags",
    "test": "jest --detectOpenHandles",
    "test:update": "jest --updateSnapshot",
    "lint:fix": "npm run lint -- --fix",
    "lint": "eslint {src,tools,test}/**/*.{js,ts}",
    "prettify": "prettier {src,tools,test}/**/*.{js,ts} --write --quote-props preserve"
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "{src,tools,test}/**/*.{js,ts}": [
      "prettier --write",
      "eslint --fix",
      "git add"
    ],
    "static/assets/js/**/*.js": [
      "prettier --write",
      "eslint --fix",
      "git add"
    ]
  },
  "devDependencies": {
    "@types/jest": "^26.0.23",
    "@types/node": "^15.12.2",
    "@types/webpack-env": "^1.16.0",
    "@typescript-eslint/eslint-plugin": "^4.26.1",
    "@typescript-eslint/parser": "^4.26.1",
    "commander": "^4.1.1",
    "consola": "^2.15.3",
    "dts-bundle": "^0.7.3",
    "eslint": "^7.28.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-babel": "^5.3.1",
    "eslint-plugin-html": "^6.1.2",
    "eslint-plugin-jest": "^24.3.6",
    "eslint-plugin-prettier": "^3.4.0",
    "find-up": "^4.1.0",
    "fs-extra": "^8.1.0",
    "husky": "^3.1.0",
    "jest": "^26.6.3",
    "lint-staged": "^9.5.0",
    "markdown-toc": "^1.2.0",
    "move-cli": "^1.2.1",
    "nodemon": "^2.0.7",
    "prettier": "^2.3.1",
    "raw-loader": "^4.0.2",
    "remove-strict-webpack-plugin": "^0.1.2",
    "rimraf": "^3.0.2",
    "set-tz": "^0.2.0",
    "ts-jest": "^26.5.6",
    "ts-loader": "^8.3.0",
    "ts-node": "^10.0.0",
    "typescript": "~4.2.2",
    "version-bump-prompt": "^5.0.7",
    "webpack": "^4.46.0",
    "webpack-cli": "^3.3.12",
    "webpack-shell-plugin": "^0.5.0"
  },
  "dependencies": {
    "sync-request": "^6.1.0"
  }
}


================================================
FILE: site/CNAME
================================================
wenyan-lang.lingdong.works

================================================
FILE: site/ide.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Refresh" content="0; url=http://wy-lang.org/ide"/>
  <script type="text/javascript">
    window.location.href="http://wy-lang.org/ide"
  </script>
</head>
<body>
  <p>Please visit <a href="http://wy-lang.org/ide">http://wy-lang.org</a> instead.</p>
</body>
</html>

================================================
FILE: site/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Refresh" content="0; url=http://wy-lang.org"/>
  <script type="text/javascript">
    window.location.href="http://wy-lang.org"
  </script>
</head>
<body>
  <p>Please visit <a href="http://wy-lang.org">http://wy-lang.org</a> instead.</p>
</body>
</html>

================================================
FILE: src/browser_runtime.ts
================================================
import { execute } from "./parser";

(() => {
  const isDev = false;

  async function run(script) {
    const scoped = !!script.attributes.scoped;
    const outputHanzi = !(
      script.attributes.outputHanzi &&
      script.attributes.outputHanzi.value === "false"
    );
    const allowHttp = !!script.attributes.allowHttp;
    let code = script.innerText;
    let importPaths = [window.location.origin];
    if (script.src) {
      const response = await fetch(script.src);
      code = (await response.text()).toString();
      importPaths.push(
        script.src
          .split("/")
          .slice(0, -1)
          .join("/")
      );
    }
    execute(code, {
      scoped,
      outputHanzi,
      logCallback: isDev ? console.log : () => {},
      resetVarCnt: false,
      importPaths,
      allowHttp
    });
  }

  document.addEventListener("DOMContentLoaded", async () => {
    const scripts = Array.from(document.getElementsByTagName("script")).filter(
      s => s.type === "application/wenyan"
    );

    for (const script of scripts) {
      try {
        await run(script);
      } catch (e) {
        console.error(e);
      }
    }
  });
})();


================================================
FILE: src/cli.ts
================================================
import fs from "fs";
import path from "path";
import commander from "commander";
import findUp from "find-up";
import { version } from "./version";
import { compile, evalCompiled } from "./parser";
import { render, unrender } from "./render";
import { outputHanziWrapper } from "./execute";

var readline;
var rl;
var inpHistory = [];
var inpHistoryPtr = -1;

var Logo = ` ,_ ,_\n \\/ ==\n /\\ []\n`;
const MODULE_LIBRARY_NAME = "藏書樓";

const program = new commander.Command();
program
  .version(version, "-v, --version", "Output the version")
  .name("wenyan")
  .arguments("[files...]")
  .action(files => {
    if (!files) {
      program.files = [];
    } else if (!Array.isArray(files)) {
      program.files = [files];
    } else {
      program.files = files;
    }
  })
  .option(
    "-l, --lang <lang>",
    'Target language, can be "js", "py" or "rb"',
    "js"
  )
  .option("-c, --compile", "Output the compiled code instead of executing it")
  .option("-e, --eval <code>", "Evaluate script")
  .option("-i, --interactive", "Interactive REPL")
  .option(
    "-o, --output [file]",
    "Output compiled code or executing result to file"
  )
  .option("-r, --render", "Outputs renderings")
  .option(
    "--roman [method]",
    'Romanize identifiers. The method can be "pinyin", "baxter" or "unicode"'
  )
  .option("--strict", "Enable static typechecking", false)
  .option("--allowHttp", "Allow to import from http", false)
  .option("--dir <path>", "Directory to importing from, seprates with comma(,)")
  .option("--no-outputHanzi", "Don't convert output to hanzi", false)
  .option("--log <file>", "Save log to file")
  .option("--title <title>", "Override title in rendering")
  .helpOption("-h, --help", "Display help");

const emptyCall = process.argv.length <= 2;
const showHelp = process.argv.includes("-h") || process.argv.includes("--help");

if (emptyCall || showHelp) {
  program.outputHelp(help => {
    if (!help) return "";
    let text = "\n";
    text += Logo;
    text += `\nWENYAN LANG 文言 Compiler v${version}\n\n`;
    text += help;
    text += "\n";
    return text;
  });
  process.exit();
}

program.parse(process.argv);

(async () => {
  preprocess();

  if (program.compile) {
    output(getCompiled());
  } else if (program.render) {
    doRender();
  } else if (program.interactive) {
    await interactive();
  } else {
    await exec();
  }
})().catch(e => {
  console.error(e);
});

// ====== Utils ======

function preprocess() {
  if (!program.output && program.render) {
    // render always outputs
    program.output = true;
  }

  if (program.output == true) {
    // only set --option but not the path
    if (!program.files.length) {
      console.error("Can not write to undefined path");
      process.exit(1);
    }
    let base = program.files[0]
      .split(".")
      .slice(0, -1)
      .join(".");
    if (program.compile) program.output = `${base}.${program.lang}`;
    else if (program.render) program.output = `${base}.svg`;
    else program.output = `${base}.log`;
  }

  if (program.roman == true) {
    program.roman = "pinyin";
  }
}

function getCompiled() {
  const source = getSource();

  return compile(source, {
    ...getCompileOptions()
  });
}

function getImportPaths() {
  const pathes = [];
  if (program.dir) {
    pathes.push(...program.dir.split(","));
  }

  const moduleLib = findModuleLibrary();
  if (moduleLib) pathes.push(moduleLib);

  pathes.push(...program.files.map(file => path.resolve(path.dirname(file))));
  pathes.push(path.resolve("."));
  return Array.from(new Set(pathes));
}

function findModuleLibrary() {
  return findUp.sync(MODULE_LIBRARY_NAME, { type: "directory" });
}

function getCompileOptions() {
  return {
    lang: program.lang,
    romanizeIdentifiers: program.roman,
    strict: !!program.strict,
    allowHttp: !!program.allowHttp,
    importPaths: getImportPaths(),
    logCallback: logHandler(program.log, "a"),
    errorCallback: function(x) {
      console.error(x);
      process.exit();
    }
  };
}

function resolvePath(x) {
  return path.resolve(x);
}

function getSource() {
  let scripts = program.files
    .map(x =>
      x.endsWith(".svg")
        ? unrender([fs.readFileSync(resolvePath(x)).toString()])
        : fs.readFileSync(resolvePath(x)).toString()
    )
    .join("\n");

  if (program.eval) scripts += `\n${program.eval}`;

  return scripts;
}

function output(data) {
  if (program.output == undefined) return console.log(data);
  else fs.writeFileSync(resolvePath(program.output), data, "utf-8");
}

function getTitle() {
  var title = program.title;
  if (!title && typeof program.output === "string")
    title = program.output
      .split(".")
      .slice(0, -1)
      .join(".");
  if (!title && program.files.length)
    title = program.files[0]
      .split(".")
      .slice(0, -1)
      .join(".");
  return title;
}

function doRender() {
  var svgs = render(getTitle(), getSource(), { plotResult: false });

  var outputEndsWithSvg = program.output.toLowerCase().endsWith(".svg");

  // only one page rendered
  if (svgs.length === 1) {
    if (!outputEndsWithSvg) program.output += ".svg";
    var filepath = resolvePath(program.output);
    fs.writeFileSync(filepath, svgs[0]);
    console.log(filepath); // Outputs generated filename
  }
  // multiple pages rendered, output file as `filename.001.svg` etc
  else {
    if (outputEndsWithSvg) program.output = program.output.slice(0, -4); // remove .svg suffix

    for (var i = 0; i < svgs.length; i++) {
      var filepath = resolvePath(
        `${program.output}.${i.toString().padStart(3, "0")}.svg`
      );
      fs.writeFileSync(filepath, svgs[i]);
      console.log(filepath); // Outputs generated filename
    }
  }
}

function interactive() {
  if (program.lang !== "js") {
    console.error(
      `Target language "${program.lang}" is not supported for interactive mode.`
    );
    process.exit(1);
  }
  replscope();
  repl(getCompiled());
}

function exec() {
  if (program.lang !== "js") {
    console.error(
      `Target language "${program.lang}" is not supported for direct executing. Please use --compile option instead.`
    );
    process.exit(1);
  }
  evalCompiled(getCompiled(), {
    outputHanzi: program["outputHanzi"],
    lang: program.lang
  });
}

function replscope() {
  function generate(depth) {
    var s0 = "global.__scope=new function(){\n";
    var s1 = "\n}";
    for (var i = 0; i < depth; i++) {
      var istr = "__" + ("" + i).padStart(8, "0");
      s0 += `this.evil=function(${istr}){global.__scope=this;var __r=eval(${istr});\n`;
      s1 = `;return __r}` + s1;
    }
    return eval(s0 + s1);
  }
  var stackCallSize = 1000;
  for (var i = stackCallSize; i > 0; i -= 200) {
    try {
      generate(i);
      stackCallSize = i;
      break;
    } catch (e) {
      //console.log(i+ " exceeds max stack size");
    }
  }
  // console.log("final stack size "+stackCallSize);
}

function repl(prescript?: string) {
  if (!readline) {
    readline = require("readline");
    process.stdin.setMaxListeners(100000000000000);
    process.stdin.on("data", function(e) {
      var esc = JSON.stringify(e.toString());
      if (esc == `"\\u001b[A"`) {
        if (inpHistoryPtr == -1) {
          inpHistoryPtr = inpHistory.length;
        }
        if (inpHistory.length) {
          inpHistoryPtr =
            (inpHistoryPtr - 1 + inpHistory.length) % inpHistory.length;
        }
        rl.write(null, { ctrl: true, name: "u" });
        rl.write(inpHistory[inpHistoryPtr]);
      } else if (esc == `"\\u001b[B"`) {
        if (inpHistoryPtr == -1) {
          inpHistoryPtr = inpHistory.length;
        }
        if (inpHistory.length) {
          inpHistoryPtr = (inpHistoryPtr + 1) % inpHistory.length;
        }
        rl.write(null, { ctrl: true, name: "u" });
        rl.write(inpHistory[inpHistoryPtr]);
      }
    });
  }
  // console.log(JSON.stringify(inpHistory))
  rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
  if (prescript) {
    var old_log = console.log;
    try {
      console.log = outputHanziWrapper(console.log, program.outputHanzi);
      // @ts-ignore
      global.__scope.evil(prescript);
      console.log = old_log;
    } catch (e) {
      console.log = old_log;
      console.log(e);
    }
  }

  // @ts-ignore
  global.haserr = false;
  rl.question("> ", inp => {
    // console.log(JSON.stringify(inp))
    var out = compile(inp, {
      lang: "js",
      romanizeIdentifiers: program.roman,
      logCallback: logHandler(null, "a"),
      errorCallback: function(x) {
        console.error(x);
        // @ts-ignore
        global.haserr = true;
      }
    });
    // @ts-ignore
    if (global.haserr) {
    }
    if (inp.length) {
      inpHistory.push(inp);
    }
    rl.close();
    repl(out);
    inpHistoryPtr = -1;
  });
}

function logHandler(f, mode) {
  if (!f) {
    return () => 0;
  }

  if (f == "/dev/stdout") {
    return x =>
      typeof x == "string"
        ? console.log(x)
        : console.dir(x, { depth: null, maxArrayLength: null });
  }

  if (f == "/dev/stderr") {
    return console.error;
  }

  if (mode == "a") {
    return x => {
      fs.appendFileSync(
        resolvePath(f),
        (typeof x == "object" ? JSON.stringify(x) : x.toString()) + "\n"
      );
    };
  }

  if (mode == "w") {
    return x => {
      fs.writeFileSync(
        resolvePath(f),
        (typeof x == "object" ? JSON.stringify(x) : x.toString()) + "\n"
      );
    };
  }
}


================================================
FILE: src/converts/hanzi2num.ts
================================================
export enum NumberTokenType {
  SIGN, // 負
  DIGIT, // 一二三...
  DECIMAL, // ·
  INT_MULT, // 十百千萬億...
  FRAC_MULT, // 分釐毫...
  DELIM, // 又
  ZERO, // 零

  // pseudo tokens
  BEGIN, // <BEGIN>
  END // <END>
}
export type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";

export type NumberToken =
  | {
      type: NumberTokenType.ZERO | NumberTokenType.DIGIT;
      digit: Digit;
    }
  | {
      type: NumberTokenType.SIGN;
      sign: number;
    }
  | {
      type:
        | NumberTokenType.DECIMAL
        | NumberTokenType.INT_MULT
        | NumberTokenType.FRAC_MULT;
      exp: number;
    }
  | {
      type: NumberTokenType.DELIM | NumberTokenType.BEGIN | NumberTokenType.END;
    };

export interface ParseResult {
  sign: number;
  exp: number;
  digits: Digit[];
}

const NUM_TOKENS = {
  負: { type: NumberTokenType.SIGN, sign: -1 },
  "·": { type: NumberTokenType.DECIMAL, exp: 0 }, // U+00B7 Middle Dot
  又: { type: NumberTokenType.DELIM },
  有: { type: NumberTokenType.DELIM },
  零: { type: NumberTokenType.ZERO, digit: "0" },
  一: { type: NumberTokenType.DIGIT, digit: "1" },
  二: { type: NumberTokenType.DIGIT, digit: "2" },
  三: { type: NumberTokenType.DIGIT, digit: "3" },
  四: { type: NumberTokenType.DIGIT, digit: "4" },
  五: { type: NumberTokenType.DIGIT, digit: "5" },
  六: { type: NumberTokenType.DIGIT, digit: "6" },
  七: { type: NumberTokenType.DIGIT, digit: "7" },
  八: { type: NumberTokenType.DIGIT, digit: "8" },
  九: { type: NumberTokenType.DIGIT, digit: "9" },
  十: { type: NumberTokenType.INT_MULT, exp: 1 },
  百: { type: NumberTokenType.INT_MULT, exp: 2 },
  千: { type: NumberTokenType.INT_MULT, exp: 3 },
  萬: { type: NumberTokenType.INT_MULT, exp: 4 },
  億: { type: NumberTokenType.INT_MULT, exp: 8 },
  兆: { type: NumberTokenType.INT_MULT, exp: 12 },
  京: { type: NumberTokenType.INT_MULT, exp: 16 },
  垓: { type: NumberTokenType.INT_MULT, exp: 20 },
  秭: { type: NumberTokenType.INT_MULT, exp: 24 },
  穰: { type: NumberTokenType.INT_MULT, exp: 28 },
  溝: { type: NumberTokenType.INT_MULT, exp: 32 },
  澗: { type: NumberTokenType.INT_MULT, exp: 36 },
  正: { type: NumberTokenType.INT_MULT, exp: 40 },
  載: { type: NumberTokenType.INT_MULT, exp: 44 },
  極: { type: NumberTokenType.INT_MULT, exp: 48 },
  分: { type: NumberTokenType.FRAC_MULT, exp: -1 },
  釐: { type: NumberTokenType.FRAC_MULT, exp: -2 },
  毫: { type: NumberTokenType.FRAC_MULT, exp: -3 },
  絲: { type: NumberTokenType.FRAC_MULT, exp: -4 },
  忽: { type: NumberTokenType.FRAC_MULT, exp: -5 },
  微: { type: NumberTokenType.FRAC_MULT, exp: -6 },
  纖: { type: NumberTokenType.FRAC_MULT, exp: -7 },
  沙: { type: NumberTokenType.FRAC_MULT, exp: -8 },
  塵: { type: NumberTokenType.FRAC_MULT, exp: -9 },
  埃: { type: NumberTokenType.FRAC_MULT, exp: -10 },
  渺: { type: NumberTokenType.FRAC_MULT, exp: -11 },
  漠: { type: NumberTokenType.FRAC_MULT, exp: -12 },
  // eslint-disable-next-line no-useless-computed-key
  ["〇"]: { type: NumberTokenType.DIGIT, digit: "0" } // U+3007 Ideographic Number Zero
} as Record<string, NumberToken>;

const NEG_WORD = "負";
const INF_WORD = "無限大數";
const NAN_WORD = "不可算數";

const DECIMAL_WORD = {
  readout: "又"
};

const DIGIT_WORDS = {
  readout: {
    0: "零",
    1: "一",
    2: "二",
    3: "三",
    4: "四",
    5: "五",
    6: "六",
    7: "七",
    8: "八",
    9: "九"
  }
};

const MULT_WORDS = {
  readout: [
    { str: "極", exp: 48 },
    { str: "載", exp: 44 },
    { str: "正", exp: 40 },
    { str: "澗", exp: 36 },
    { str: "溝", exp: 32 },
    { str: "穰", exp: 28 },
    { str: "秭", exp: 24 },
    { str: "垓", exp: 20 },
    { str: "京", exp: 16 },
    { str: "兆", exp: 12 },
    { str: "億", exp: 8 },
    { str: "萬", exp: 4 },
    { str: "千", exp: 3 },
    { str: "百", exp: 2 },
    { str: "十", exp: 1 },
    { str: "", exp: 0 },
    { str: "分", exp: -1 },
    { str: "釐", exp: -2 },
    { str: "毫", exp: -3 },
    { str: "絲", exp: -4 },
    { str: "忽", exp: -5 },
    { str: "微", exp: -6 },
    { str: "纖", exp: -7 },
    { str: "沙", exp: -8 },
    { str: "塵", exp: -9 },
    { str: "埃", exp: -10 },
    { str: "渺", exp: -11 },
    { str: "漠", exp: -12 }
  ]
};

const eMultState = {
  NONE: "NONE", // <END>, 一 (ambiguous: 一萬一 or 一十一 or 一·一 or 一絲一)
  FRAC: "FRAC", // ...微
  INT: "INT", // ...萬, ...·,
  DONE: "DONE", // 負一,
  SIGN: "SIGN"
};

const eDigitState = {
  NONE: "NONE", // <END>, ·
  MULT: "MULT", // 微
  MULT_AMBIG: "MULT_AMBIG", // 十 (ambiguous: ...十 or 一十)
  DIGIT: "DIGIT", // 一
  DIGIT_WITH_ZERO: "DIGIT_WITH_ZERO", // 一...零, 零零, 零一...零,
  DELIM: "DELIM", // 又
  ZERO: "ZERO", // 零<END>, 零·, 零又, 零微, 零一
  SIGN: "SIGN", // 負
  ZERO_MULT_AMBIG: "ZERO_MULT_AMBIG" // 零十 (ambiguous: 零一十 or 零十 or 〇十)
};

const RESULT_2_TO_63 = {
  sign: 1,
  exp: 0,
  digits: "9223372036854775808".split("").reverse() as Digit[]
};

export function hanzi2numstr(s: string): string | null {
  // returns array of tokens on success, null on invalid string
  function tokenize(s: string) {
    const result: NumberToken[] = [{ type: NumberTokenType.BEGIN }];
    for (let i = 0; i < s.length; ++i) {
      const tokenStr = s.charAt(i);
      if (!NUM_TOKENS[tokenStr]) {
        return null;
      }

      result.push(NUM_TOKENS[tokenStr]);
    }
    result.push({ type: NumberTokenType.END });
    return result;
  }

  // returns:
  //   on success: {
  //     sign:   +1/-1/+Infinity/-Infinity/NaN,
  //     exp:    power of 10,
  //     digits: array of digit chars from lowest to highest, with leading and trailing zeros
  //   }
  //   on invalid string: null
  // result = sign * {digits[length-1..0]} * 10^exp
  // e.g. 負零又五毫零絲 = { sign: -1, exp: -4, digits: ["0", "5", "0", "0, "0"] } = -00050e-4 = -0.005
  function parse(tokens: NumberToken[]): ParseResult | null {
    // parses the number string backwards, from lowest to highest digit
    // parser state
    let digitState = eDigitState.NONE;

    // multiplier stack, keep track of all active multiplier exponents
    const multStack = {
      isEmpty() {
        return this._exps.length === 0;
      },
      total() {
        return this._expAdd;
      },
      top() {
        return this._exps[this._exps.length - 1];
      },
      state() {
        if (this.isEmpty()) {
          return eMultState.NONE;
        } else if (this._exps[0] < 0) {
          return eMultState.FRAC;
        } else if (this._exps[0] < Infinity) {
          return eMultState.INT;
        } else {
          return eMultState.DONE;
        }
      },

      push(exp: number) {
        this._expAdd += exp;
        this._exps.push(exp);
      },
      pop() {
        this._expAdd -= this.top();
        this._exps.pop();
      },
      clear() {
        this._expAdd = 0;
        this._exps = [];
      },
      markDone() {
        this.clear();
        this.push(Infinity);
      },

      _exps: [] as number[],
      _expAdd: 0
    };

    // result, with different convension of exp for internal use
    const result = {
      sign() {
        return this._sign;
      },
      exp() {
        return this._exp;
      },
      digits() {
        return this._digits;
      },

      applySign(newSign: number) {
        this._sign *= newSign;
      },
      // digit: number or array of numbers
      push(digit: Digit[] | Digit) {
        if (Array.isArray(digit)) {
          this._digits = this._digits.concat(digit);
          this._exp += digit.length;
        } else {
          this._digits.push(digit);
          ++this._exp;
        }
      },
      fillZeros(newExp: number) {
        this.push(Array(newExp - this._exp).fill("0"));
      },
      resetExp(newExp: number) {
        this._exp = newExp;
      },

      // the result is sign * 0.{digits[length-1..0]} * 10^exp
      _sign: 1, // +1/-1
      _exp: 0, // one plus exponent of the highest digit
      _digits: [] as Digit[] // lowest to highest
    };

    // parses the number string backwards, discarding <END>
    for (let i = tokens.length - 1; i > 0; --i) {
      const token = tokens[i - 1];

      // sign should be the first char
      if (
        multStack.state() === eMultState.SIGN &&
        token.type !== NumberTokenType.BEGIN
      ) {
        return null;
      }

      // disambiguate omitted 一
      switch (digitState) {
        case eDigitState.MULT_AMBIG:
          switch (token.type) {
            // <BEGIN>(一?)十 -> <BEGIN>一十
            // 負(一?)十 -> 負一十
            // 又(一?)十 -> 又一十
            // ·(一?)十 -> ·一十
            // 分(一?)十絲 -> 分一十絲
            case NumberTokenType.BEGIN:
            case NumberTokenType.SIGN:
            case NumberTokenType.DELIM:
            case NumberTokenType.DECIMAL:
            case NumberTokenType.FRAC_MULT:
              result.push("1");
              digitState = eDigitState.DIGIT;
              break;

            // 一(一?)十 -> 一十
            case NumberTokenType.DIGIT:
              digitState = eDigitState.MULT;
              break;

            // 百(一?)十 -> 百一十
            // 千(一?)十 -> 千一十
            // 百(一?)萬 -> 百萬
            case NumberTokenType.INT_MULT:
              if (multStack.top() < (token.exp || 1)) {
                result.push("1");
                digitState = eDigitState.DIGIT;
              } else {
                digitState = eDigitState.MULT;
              }
              break;

            // 零(一?)十 -> 零(一?)十
            case NumberTokenType.ZERO:
              digitState = eDigitState.MULT_AMBIG;
              break;

            default:
              break;
          }
          break;

        case eDigitState.ZERO_MULT_AMBIG:
          switch (token.type) {
            // <BEGIN>(零一|零|〇)十 -> <BEGIN>〇十
            // 負(零一|零|〇)十 -> 負〇十
            // 一(零一|零|〇)十 -> 一〇十
            // 又(零一|零|〇)十 -> 又〇十
            // 零(零一|零|〇)十 -> 〇〇十
            case NumberTokenType.BEGIN:
            case NumberTokenType.SIGN:
            case NumberTokenType.DIGIT:
            case NumberTokenType.DELIM:
            case NumberTokenType.ZERO:
              result.push("0");
              digitState = eDigitState.DIGIT_WITH_ZERO;
              break;

            // ·(零一|零|〇)十絲 -> ·零一十絲
            // ·(零一|零|〇)十釐 -> ·〇十釐
            // ·(零一|零|〇)十分 -> error
            // ·(零一|零|〇)百分 -> error
            // 分(零一|零|〇)十絲 -> 分零一十絲
            // 分(零一|零|〇)十毫 -> 分〇十絲
            // 分(零一|零|〇)十釐 -> error
            // 分(零一|零|〇)十分 -> error
            case NumberTokenType.DECIMAL:
            case NumberTokenType.FRAC_MULT:
              if (multStack.total() + 1 < token.exp) {
                result.push("1");
                result.push("0");
                digitState = eDigitState.ZERO;
              } else if (multStack.total() + 1 === token.exp) {
                result.push("0");
                digitState = eDigitState.DIGIT_WITH_ZERO;
              } else {
                return null;
              }
              break;

            // 千(零一|零|〇)十 -> 千零一十
            // 百(零一|零|〇)十 -> 百〇十
            // 萬(零一|零|〇)萬 -> 萬零萬
            // 百(零一|零|〇)萬 -> 百零萬
            case NumberTokenType.INT_MULT:
              if (token.exp == null) {
                return null;
              }

              if (multStack.top() + 1 < token.exp) {
                result.push("1");
                result.push("0");
                digitState = eDigitState.ZERO;
              } else if (multStack.top() + 1 === token.exp) {
                result.push("0");
                digitState = eDigitState.DIGIT_WITH_ZERO;
              } else {
                result.push("0");
                digitState = eDigitState.ZERO;
              }
              break;

            default:
              break;
          }
          break;

        default:
          break;
      }

      // determine the exponent of tail digits
      if (multStack.state() === eMultState.NONE) {
        switch (token.type) {
          case NumberTokenType.INT_MULT:
            // exponent is correct
            break;

          case NumberTokenType.DECIMAL:
          case NumberTokenType.FRAC_MULT:
            if (token.exp != null) {
              result.resetExp(token.exp);
            }
            break;

          default:
            break;
        }
      }

      // determine the current exponent and update exponent stack
      const currExp = (function() {
        switch (token.type) {
          case NumberTokenType.BEGIN:
          case NumberTokenType.SIGN:
            switch (digitState) {
              // <BEGIN>微 -> error
              // 負微 -> error
              case eDigitState.MULT:
                return null;

              default:
                multStack.markDone();
                return multStack.total();
            }

          case NumberTokenType.DIGIT:
          case NumberTokenType.ZERO:
            switch (digitState) {
              // 一又 -> 一·
              // 零又 -> 零·
              case eDigitState.DELIM:
                multStack.clear();
                multStack.push(0);
                return multStack.total();

              default:
                return result.exp();
            }

          case NumberTokenType.DELIM:
            switch (digitState) {
              // 又又 -> error
              case eDigitState.DELIM:
                return null;

              default:
                return result.exp();
            }

          // ·...絲 -> ·
          // 釐...絲 -> 釐
          // ·絲 -> error
          // 釐絲 -> error
          case NumberTokenType.DECIMAL:
          case NumberTokenType.FRAC_MULT:
            if (digitState === eDigitState.MULT) {
              return null;
            } else {
              multStack.clear();
              multStack.push(token.exp);
              return multStack.total();
            }

          case NumberTokenType.INT_MULT:
            switch (digitState) {
              // 百又...絲 -> 百
              // 萬又...百萬億 -> 萬萬億
              case eDigitState.DELIM:
                if (multStack.state() === eMultState.FRAC) {
                  multStack.clear();
                  multStack.push(token.exp);
                } else {
                  while (!multStack.isEmpty() && multStack.top() < token.exp) {
                    multStack.pop();
                  }

                  multStack.push(token.exp);
                }
                break;

              // 萬...百萬億 -> 萬萬億
              // 萬零...百萬億 -> 萬萬億
              // 百...十絲 -> 百絲
              // 千零...十絲 -> 千絲
              case eDigitState.NONE:
              case eDigitState.MULT:
              case eDigitState.MULT_AMBIG:
              case eDigitState.DIGIT:
              case eDigitState.DIGIT_WITH_ZERO:
              case eDigitState.ZERO:
              case eDigitState.ZERO_MULT_AMBIG:
                while (
                  !multStack.isEmpty() &&
                  multStack.top() < token.exp &&
                  multStack.top() >= 0
                ) {
                  multStack.pop();
                }

                multStack.push(token.exp);
                break;
            }
            return multStack.total();
        }
      })();
      if (currExp == null) {
        return null;
      }

      // check for overlapping decimal places
      if (currExp < result.exp()) {
        return null;
      }

      // check for disallowed missing decimal places
      if (currExp > result.exp()) {
        const check = function() {
          if (
            token.type === NumberTokenType.BEGIN ||
            token.type === NumberTokenType.SIGN
          ) {
            return true;
          }

          if (
            digitState === eDigitState.DELIM ||
            digitState === eDigitState.ZERO
          ) {
            return true;
          }

          if (token.type === NumberTokenType.INT_MULT) {
            return true;
          }

          if (
            token.type === NumberTokenType.FRAC_MULT ||
            token.type === NumberTokenType.DECIMAL
          ) {
            return true;
          }

          return false;
        };

        if (!check()) {
          return null;
        }

        if (multStack.state() !== eMultState.DONE) {
          result.fillZeros(currExp);
        }
      }

      // push the digit, update parser state
      switch (token.type) {
        case NumberTokenType.BEGIN:
          break;

        case NumberTokenType.SIGN:
          result.applySign(token.sign);
          digitState = eDigitState.SIGN;
          break;

        case NumberTokenType.DIGIT:
          result.push(token.digit);
          if (
            digitState === eDigitState.ZERO ||
            digitState === eDigitState.DIGIT_WITH_ZERO
          ) {
            digitState = eDigitState.DIGIT_WITH_ZERO;
          } else {
            digitState = eDigitState.DIGIT;
          }

          break;

        case NumberTokenType.DECIMAL:
          digitState = eDigitState.NONE;
          break;

        case NumberTokenType.INT_MULT:
          digitState = eDigitState.MULT_AMBIG;
          break;

        case NumberTokenType.FRAC_MULT:
          digitState = eDigitState.MULT;
          break;

        case NumberTokenType.DELIM:
          digitState = eDigitState.DELIM;
          break;

        case NumberTokenType.ZERO:
          switch (digitState) {
            case eDigitState.NONE:
            case eDigitState.MULT:
            case eDigitState.DIGIT:
            case eDigitState.DELIM:
              result.push(token.digit);
              digitState = eDigitState.ZERO;
              break;

            case eDigitState.DIGIT_WITH_ZERO:
            case eDigitState.ZERO:
              result.push(token.digit);
              digitState = eDigitState.ZERO;
              break;

            case eDigitState.MULT_AMBIG:
              digitState = eDigitState.ZERO_MULT_AMBIG;
              break;
          }
          break;
      }
    }

    if (result.digits().length === 0) {
      return null;
    }

    return {
      sign: result.sign(),
      exp: result.exp() - result.digits().length,
      digits: result.digits()
    };
  }

  function getDigit(result: any, exp: number) {
    const idx = exp - result.exp;
    if (idx >= 0 && idx < result.digits.length) {
      return result.digits[idx];
    } else {
      return "0";
    }
  }

  function compareMagnitude(resultA: ParseResult, resultB: ParseResult) {
    const getMaxExp = (result: ParseResult) =>
      result.exp + (result.digits.length - 1);

    const maxExp = Math.max(getMaxExp(resultA), getMaxExp(resultB));
    for (let i = maxExp; i >= resultA.exp || i >= resultB.exp; --i) {
      const digitA = Number(getDigit(resultA, i));
      const digitB = Number(getDigit(resultB, i));
      if (digitA > digitB) {
        return 1;
      } else if (digitA < digitB) {
        return -1;
      }
    }
    return 0;
  }

  // parse
  const tokens = tokenize(s);
  if (tokens == null) {
    return null;
  }

  const result = parse(tokens);
  if (result == null) {
    return null;
  }

  // build decimal string
  if (!Number.isFinite(result.sign)) {
    // infinity/NaN
    return result.sign.toString();
  }
  let str = result.sign < 0 ? "-" : "";

  // no fractional digits (including zero) and fits in int64?
  const printAsInt = (function() {
    if (result.exp < 0) {
      return false;
    }

    const c = compareMagnitude(result, RESULT_2_TO_63);
    return result.sign < 0 ? c <= 0 : c < 0;
  })();

  // digit range, leading and trailing zeros trimmed
  const rend = result.digits.findIndex(x => x !== "0");
  if (rend < 0) {
    str += "0";
    return str;
  }
  const rendExp = result.exp + rend;

  let rbegin = result.digits.length;
  while (result.digits[rbegin - 1] === "0") {
    --rbegin;
  }

  const rbeginExp = result.exp + rbegin;

  // compute length of fixed and scientific format
  let expStr = "";
  let printAsScientific = false;
  if (!printAsInt) {
    const scientificExp = result.exp + (rbegin - 1);
    expStr =
      (scientificExp < 0 ? "e-" : "e+") + Math.abs(scientificExp).toString();
    const fixedLen =
      rendExp < 0 ? Math.max(rbeginExp, 1) - rendExp + 1 : rbeginExp;
    const scientificMagLen = rbegin - rend > 1 ? rbegin - rend + 1 : 1;
    if (scientificMagLen + expStr.length < fixedLen) {
      printAsScientific = true;
    }
  }

  if (printAsScientific) {
    str += result.digits[rbegin - 1];
    if (rbegin - 1 > rend) {
      str += ".";
      for (let i = rbegin - 1; i > rend; --i) {
        str += result.digits[i - 1];
      }
    }
    str += expStr;
    return str;
  } else {
    for (let i = Math.max(rbeginExp, 1); i > 0; --i) {
      str += getDigit(result, i - 1);
    }

    if (rendExp < 0) {
      str += ".";
      for (let i = 0; i > rendExp; --i) {
        str += getDigit(result, i - 1);
      }
    }
    return str;
  }
}

export function hanzi2num(s: string): number {
  const str = hanzi2numstr(s);
  if (str == null) {
    return NaN;
  } else {
    return Number(str);
  }
}

export function num2hanzi(
  n: number,
  format = "",
  precision = undefined
): string {
  if (!Number.isFinite(n)) {
    if (n === Infinity) {
      return INF_WORD;
    } else if (n === -Infinity) {
      return NEG_WORD + INF_WORD;
    } else {
      return NAN_WORD;
    }
  }

  // the same format as hanzi2numstr.parse
  function parseNumStr(str: string): ParseResult {
    function myIndexOf(str: string, val: string) {
      const idx = str.indexOf(val);
      return idx < 0 ? str.length : idx;
    }
    const sign = str.charAt(0) === "-" ? -1 : 1;
    const digitIndex = "+-".includes(str.charAt(0)) ? 1 : 0;
    const expIndex = myIndexOf(str, "e");
    const scientificExp =
      expIndex === str.length ? 0 : Number(str.substring(expIndex + 1));
    const decimalIndex = myIndexOf(str.substring(0, expIndex), ".");
    const intStr = str.substring(digitIndex, decimalIndex);
    const intDigits = intStr.split("").reverse() as Digit[];
    const fracStr = str.substring(
      Math.min(decimalIndex + 1, expIndex),
      expIndex
    );
    const fracDigits = fracStr.split("").reverse() as Digit[];
    return {
      sign,
      exp: scientificExp - fracDigits.length,
      digits: fracDigits.concat(intDigits)
    };
  }

  // reserved for future extension
  const chineseFormat = "readout";
  const multWords = MULT_WORDS[chineseFormat];
  const digitWords = DIGIT_WORDS[chineseFormat];
  const decimalWord = DECIMAL_WORD[chineseFormat];

  let numStr = precision === undefined ? n.toString() : n.toFixed(precision);
  let result = parseNumStr(numStr);
  let signStr = result.sign < 0 ? NEG_WORD : "";
  let rend = result.digits.findIndex(x => x !== "0");
  if (rend < 0) {
    return signStr + digitWords["0"];
  }

  let rbegin = result.digits.length;
  while (result.digits[rbegin - 1] === "0") {
    --rbegin;
  }

  // is this beyond the lowest fractional unit we can represent?
  const minMultExp = multWords[multWords.length - 1].exp;
  if (result.exp + rend < minMultExp) {
    // cap to lowest fractional unit and retry
    numStr = n.toFixed(-minMultExp);
    result = parseNumStr(numStr);
    signStr = result.sign < 0 ? NEG_WORD : "";
    rend = result.digits.findIndex(x => x !== "0");
    if (rend < 0) {
      return signStr + digitWords["0"];
    }

    rbegin = result.digits.length;
    while (result.digits[rbegin - 1] === "0") {
      --rbegin;
    }
  }

  // convert digits to readout format
  let str = signStr;
  let pendingZero = false;
  let i = rbegin;
  const intToReadout = function(expBias = 0) {
    let hasOutput = false;
    while (i !== rend) {
      const mult = multWords.find(x => x.exp + expBias <= result.exp + (i - 1));
      if (mult === undefined || mult.exp < 0) {
        // done with int part
        break;
      } else if (mult.exp > 0) {
        // needs higher multiplier
        if (intToReadout(expBias + mult.exp)) {
          // 零 is omitted here (100 0000 -> 一百萬)
          pendingZero = false;
          // write the multiplier
          str += mult.str;
          hasOutput = true;
        }
      } else if (mult.exp === 0) {
        if (result.digits[i - 1] !== "0") {
          // insert 零 if necessary
          if (pendingZero) {
            str += digitWords["0"];
            pendingZero = false;
          }
          // write the digit
          str += digitWords[result.digits[i - 1]];
          hasOutput = true;
        } else {
          // mark that there are zero(s) not written yet
          // 零 will be added later if necessary
          pendingZero = true;
        }
        --i;
        break;
      }
    }
    return hasOutput;
  };
  const fracToReadout = function() {
    // eslint-disable-next-line no-unmodified-loop-condition
    while (i !== rend) {
      const mult = multWords.find(x => x.exp <= result.exp + (i - 1));
      if (mult === undefined) {
        break;
      }

      if (intToReadout(mult.exp)) {
        str += mult.str;
        pendingZero = false;
      }
    }
  };

  const hasInt = intToReadout();
  pendingZero = false;
  if (i !== rend) {
    if (hasInt) {
      str += decimalWord;
    }

    // avoid 又零
    while (i !== rend && result.digits[i - 1] === "0") {
      --i;
    }

    fracToReadout();
  }
  return str;
}

export function bool2hanzi(b: boolean): string {
  return b ? "陽" : "陰";
}


================================================
FILE: src/converts/hanzi2pinyin.ts
================================================
import { RomanizeSystem } from "../types";
import pinyin from "./hanzi2roman-map-pinyin.json";
import baxter from "./hanzi2roman-map-baxter.json";

export function hanzi2unicodeEntry(s: string) {
  var y = "";
  for (var c of s) {
    y += "U";
    y += c
      .charCodeAt(0)
      .toString(16)
      .toUpperCase();
  }
  return y;
}

export function hanzi2pinyin(a: string, system: RomanizeSystem = "pinyin") {
  if (system === "unicode") return hanzi2unicodeEntry(a);

  var tab = { pinyin, baxter }[system];
  var s = "";
  for (const x of a) {
    var key = x
      .charCodeAt(0)
      .toString(16)
      .toUpperCase();
    var r = tab[key];
    if (r == undefined) {
      r = "_";
    }
    s += r.split(" ")[0];
  }
  return s;
}


================================================
FILE: src/converts/hanzi2roman-map-baxter.json
================================================
{
  "3431":"tsyinX",
  "3444":"mjuX",
  "3547":"lop",
  "3559":"tshwin tswinH",
  "3563":"ywenX",
  "3583":"xuwH xuwX",
  "3687":"tsuwng tsuwngH",
  "3694":"nrjep",
  "3745":"kuwH",
  "3754":"ew",
  "3771":"mjungH",
  "3795":"set",
  "3831":"giX",
  "3846":"mang xwang",
  "3899":"gjion",
  "3904":"phajH",
  "3925":"hojH",
  "3976":"sok",
  "4007":"kuX",
  "4020":"kjuH",
  "4022":"sywinH",
  "4175":"kowk tsyak",
  "4185":"dzij",
  "4343":"yew",
  "4356":"bjuw",
  "4439":"sjuwk srjuw",
  "4442":"yoX",
  "4496":"sinH",
  "4569":"lawX",
  "4592":"xje",
  "4612":"tswoj",
  "4633":"kim",
  "4793":"trhjeng",
  "4813":"tshjuwk",
  "4823":"sjwenH",
  "4831":"drjowk",
  "4836":"zyaeH zyek yek",
  "4845":"trhwin",
  "4848":"kaewk",
  "4885":"dzyin zyin",
  "4894":"hop",
  "5000":"trhaeng trhjang",
  "5005":"tshwojH",
  "5009":"tshang",
  "5012":"tawH tawX",
  "5013":"dam damH",
  "5014":"gjut",
  "5016":"heangX",
  "5017":"bong",
  "5018":"thang thangX tsyhangX",
  "5019":"huwH",
  "5021":"tsyhangH",
  "5026":"gjwenH",
  "5028":"kjoH",
  "5029":"tshenH",
  "5032":"tuwng",
  "5041":"tsyhing",
  "5043":"jonX",
  "5044":"nwanH",
  "5045":"tsyowngH",
  "5047":"kaeX kaeX",
  "5048":"kjot",
  "5049":"hjwiojX",
  "5053":"aewk",
  "5055":"keaj",
  "5061":"dreamX",
  "5065":"gjonH",
  "5069":"bjuwX",
  "5072":"si",
  "5074":"tsrik",
  "5075":"trhjeng trhjengH trjeng",
  "5076":"nguwH nguwX",
  "5077":"thuw",
  "5080":"kwoj",
  "5081":"suwX",
  "5085":"bjuH pjuH",
  "5091":"gjet",
  "5093":"syenH",
  "5099":"bijH",
  "5100":"ngje",
  "5101":"tswinH",
  "5103":"dzyen thanX",
  "5104":"ik",
  "5106":"gjaeng gjaengH kjaengX kjiengX",
  "5107":"xjwien",
  "5109":"gjemX",
  "5110":"pjinH",
  "5111":"ngom",
  "5112":"nyu",
  "5114":"drjuw",
  "5115":"dzreaj",
  "5117":"ngiX",
  "5120":"ljep",
  "5121":"lwoj lwojX",
  "5122":"ljoX",
  "5125":"yuwk",
  "5126":"pjew",
  "5132":"drjo",
  "5133":"dzraem dzreamH dzreamX tsrhaemH",
  "5135":"dzyuwk",
  "5137":"lejH",
  "5140":"ngwot",
  "5141":"ywinX",
  "5143":"ngjwon",
  "5144":"xjwaeng",
  "5145":"tsyhuwng",
  "5146":"drjewX",
  "5147":"xjowng",
  "5148":"sen senH",
  "5149":"kwang",
  "5152":"nye",
  "5153":"tsim",
  "5154":"thuH",
  "5155":"zijX",
  "5157":"ywenX",
  "5162":"ging king",
  "5165":"nyip",
  "5167":"nop nwo
Download .txt
gitextract_52x0jwqd/

├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── issue.md
│   └── workflows/
│       ├── cdn.yml
│       ├── publish.yml
│       └── test.yml
├── .gitignore
├── .npmrc
├── CHANGELOG.md
├── CNAME
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── README.zh-Hans.md
├── README.zh-Hant.md
├── documentation/
│   ├── Compiler-API.md
│   ├── Importing.md
│   ├── Macros.md
│   ├── Nested-Function-Calls.md
│   ├── PREFACE.md
│   ├── Runtime.md
│   ├── Standard-Lib.md
│   ├── TODO.md
│   ├── Testing.md
│   ├── Try-Catch.md
│   └── wenyan.g4
├── examples/
│   ├── README.md
│   ├── beer.wy
│   ├── breadth_first_search.wy
│   ├── clock.wy
│   ├── collatz.wy
│   ├── collatz2.wy
│   ├── crt.wy
│   ├── divination.wy
│   ├── draw_heart.wy
│   ├── eightqueens.wy
│   ├── euclidean.wy
│   ├── factorial.wy
│   ├── fibonacci.wy
│   ├── fibonacci2.wy
│   ├── fibonacci_array.wy
│   ├── fizzbuzz.wy
│   ├── hanoi.wy
│   ├── hanoi_stack.wy
│   ├── helloworld+.wy
│   ├── helloworld.wy
│   ├── import.wy
│   ├── linglong_tower.wy
│   ├── macro.wy
│   ├── mandelbrot.wy
│   ├── mergesort.wy
│   ├── misc.wy
│   ├── modinv.wy
│   ├── multiplication_table.wy
│   ├── nested_fun.wy
│   ├── obj.wy
│   ├── pascal_triangle.wy
│   ├── pi_leibniz.wy
│   ├── pi_liuhui.wy
│   ├── quicksort.wy
│   ├── quicksort_inplace.wy
│   ├── quine.wy
│   ├── quine2.wy
│   ├── selectionsort.wy
│   ├── serialization.wy
│   ├── sieve.wy
│   ├── sqrt_newton.wy
│   ├── tree.wy
│   ├── tree2.wy
│   ├── try.wy
│   ├── turing.wy
│   └── zh_sqrt.wy
├── jest.config.js
├── lib/
│   ├── js/
│   │   ├── 位經.wy
│   │   ├── 天地經.wy
│   │   ├── 格物.wy
│   │   ├── 畫譜.wy
│   │   └── 西曆法.wy
│   ├── py/
│   │   ├── 位經.wy
│   │   ├── 天地經.wy
│   │   └── 西曆法.wy
│   ├── rb/
│   │   └── 天地經.wy
│   ├── 列經.wy
│   ├── 易經.wy
│   ├── 曆法.wy
│   ├── 曆表.wy
│   ├── 渾沌經.wy
│   ├── 算經.wy
│   └── 籌經.wy
├── netlify.toml
├── package.json
├── site/
│   ├── CNAME
│   ├── ide.html
│   └── index.html
├── src/
│   ├── browser_runtime.ts
│   ├── cli.ts
│   ├── converts/
│   │   ├── hanzi2num.ts
│   │   ├── hanzi2pinyin.ts
│   │   ├── hanzi2roman-map-baxter.json
│   │   └── hanzi2roman-map-pinyin.json
│   ├── execute.ts
│   ├── highlight.js
│   ├── keywords.ts
│   ├── macro.ts
│   ├── parser.ts
│   ├── reader.ts
│   ├── render.ts
│   ├── stdlib.ts
│   ├── transpilers/
│   │   ├── base.ts
│   │   ├── index.ts
│   │   ├── js.ts
│   │   ├── py.ts
│   │   └── rb.ts
│   ├── typecheck.ts
│   ├── types.ts
│   ├── utils.ts
│   └── version.ts
├── static/
│   ├── __migrate__.html
│   ├── _redirects
│   ├── assets/
│   │   ├── css/
│   │   │   └── site.css
│   │   └── js/
│   │       └── site.js
│   ├── index.html
│   └── spec.html
├── test/
│   ├── __snapshots__/
│   │   └── examples.test.ts.snap
│   ├── examples.test.ts
│   ├── fixture/
│   │   └── nested-import/
│   │       └── 四庫全書/
│   │           ├── 序.wy
│   │           └── 本草綱目/
│   │               ├── 序.wy
│   │               └── 草部.wy
│   ├── import.test.ts
│   ├── numbers.test.ts
│   ├── reader.test.ts
│   ├── setup.js
│   ├── stdlib.calendar.test.ts
│   ├── stdlib.math.test.cases.ts
│   ├── stdlib.math.test.ts
│   ├── stdlib.wonton.test.ts
│   └── utils.ts
├── tools/
│   ├── examples.js
│   ├── make_calendar.js
│   ├── make_examples_readme.js
│   ├── publish.js
│   ├── test_parser.ts
│   ├── utils.js
│   └── wiki/
│       ├── stdlib_cheatsheet.js
│       └── update.js
├── tsconfig.json
├── webpack.base.config.js
├── webpack.config.js
└── webpack.site.config.js
Download .txt
SYMBOL INDEX (197 symbols across 33 files)

FILE: src/browser_runtime.ts
  function run (line 6) | async function run(script) {

FILE: src/cli.ts
  constant MODULE_LIBRARY_NAME (line 16) | const MODULE_LIBRARY_NAME = "藏書樓";
  function preprocess (line 93) | function preprocess() {
  function getCompiled (line 119) | function getCompiled() {
  function getImportPaths (line 127) | function getImportPaths() {
  function findModuleLibrary (line 141) | function findModuleLibrary() {
  function getCompileOptions (line 145) | function getCompileOptions() {
  function resolvePath (line 160) | function resolvePath(x) {
  function getSource (line 164) | function getSource() {
  function output (line 178) | function output(data) {
  function getTitle (line 183) | function getTitle() {
  function doRender (line 198) | function doRender() {
  function interactive (line 224) | function interactive() {
  function exec (line 235) | function exec() {
  function replscope (line 248) | function replscope() {
  function repl (line 272) | function repl(prescript?: string) {
  function logHandler (line 344) | function logHandler(f, mode) {

FILE: src/converts/hanzi2num.ts
  type NumberTokenType (line 1) | enum NumberTokenType {
  type Digit (line 14) | type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
  type NumberToken (line 16) | type NumberToken =
  type ParseResult (line 36) | interface ParseResult {
  constant NUM_TOKENS (line 42) | const NUM_TOKENS = {
  constant NEG_WORD (line 88) | const NEG_WORD = "負";
  constant INF_WORD (line 89) | const INF_WORD = "無限大數";
  constant NAN_WORD (line 90) | const NAN_WORD = "不可算數";
  constant DECIMAL_WORD (line 92) | const DECIMAL_WORD = {
  constant DIGIT_WORDS (line 96) | const DIGIT_WORDS = {
  constant MULT_WORDS (line 111) | const MULT_WORDS = {
  constant RESULT_2_TO_63 (line 164) | const RESULT_2_TO_63 = {
  function hanzi2numstr (line 170) | function hanzi2numstr(s: string): string | null {
  function hanzi2num (line 755) | function hanzi2num(s: string): number {
  function num2hanzi (line 764) | function num2hanzi(
  function bool2hanzi (line 915) | function bool2hanzi(b: boolean): string {

FILE: src/converts/hanzi2pinyin.ts
  function hanzi2unicodeEntry (line 5) | function hanzi2unicodeEntry(s: string) {
  function hanzi2pinyin (line 17) | function hanzi2pinyin(a: string, system: RomanizeSystem = "pinyin") {

FILE: src/execute.ts
  function isLangSupportedForEval (line 4) | function isLangSupportedForEval(lang: TargetLanguages) {
  function hanzinizeOuput (line 12) | function hanzinizeOuput(value: string) {
  function outputHanziWrapper (line 24) | function outputHanziWrapper(log: LogCallback, outputHanzi: boolean) {
  function evalCompiled (line 30) | function evalCompiled(

FILE: src/highlight.js
  function newEditor (line 84) | function newEditor(txt) {
  function getCaretPosition (line 103) | function getCaretPosition(element, mode) {
  function setCaretPosition (line 124) | function setCaretPosition(element, i, j, ie, je) {
  function newLineNo (line 166) | function newLineNo(ed) {

FILE: src/keywords.ts
  constant NUMBER_KEYWORDS (line 3) | const NUMBER_KEYWORDS = Array.from(
  constant KEYWORDS_DEFINE (line 7) | const KEYWORDS_DEFINE: Record<
  constant KEYWORDS (line 128) | const KEYWORDS = Object.fromEntries(ke);

FILE: src/macro.ts
  function extractMacros (line 5) | function extractMacros(src: string, options: MarcoOptions) {
  function calcBracketStarts (line 140) | function calcBracketStarts(src: string) {
  function expandMacros (line 159) | function expandMacros(src: string, macros: MacroDefinition[]) {

FILE: src/parser.ts
  constant IGNORE_SYMBOLS (line 30) | const IGNORE_SYMBOLS = "。、\n\r\t ";
  function wy2tokens (line 32) | function wy2tokens(txt: string, assert = defaultAssert()) {
  function tokenRomanize (line 169) | function tokenRomanize(tokens: Token[], system: RomanizeSystem) {
  function defaultLogCallback (line 197) | function defaultLogCallback(x: any) {
  function defaultErrorCallback (line 203) | function defaultErrorCallback(e: any) {
  function tokens2asc (line 208) | function tokens2asc(tokens: Token[], assert = defaultAssert()) {
  function compile (line 670) | function compile(txt: string, options: Partial<CompileOptions> = {}): st...
  function execute (line 790) | function execute(

FILE: src/reader.ts
  constant INDEX_FILENAME (line 8) | const INDEX_FILENAME = "序";
  function isHostTrusted (line 10) | function isHostTrusted(url: string, trustedHosts: string[]) {
  function isHttpURL (line 19) | function isHttpURL(uri: string) {
  function fetchTextSync (line 23) | function fetchTextSync(url: string, timeout: number) {
  function fetchSync (line 34) | function fetchSync(uri: string, cache: CacheObject, requestTimeout: numb...
  function importReader (line 46) | function importReader(
  function bundleImports (line 139) | function bundleImports(

FILE: src/render.ts
  constant FONT (line 5) | const FONT = "'I.Ming', 'Source Han Serif KR', 'Noto Serif CJK KR', serif";
  constant RED (line 6) | const RED = "#E53";
  constant BLACK (line 7) | const BLACK = "#222";
  constant BOOK_COLORS (line 9) | const BOOK_COLORS = {
  function render (line 36) | function render(fname, txt, { plotResult = false } = {}) {
  function unrender (line 326) | function unrender(svgs) {

FILE: src/stdlib.ts
  function loadStdlib (line 3) | function loadStdlib() {
  constant STDLIB (line 24) | const STDLIB = loadStdlib();

FILE: src/transpilers/base.ts
  type ModuleWrapperOptions (line 3) | interface ModuleWrapperOptions {
  class BaseTranspiler (line 11) | class BaseTranspiler {
    method constructor (line 17) | constructor(asc: ASCNode[]) {
    method randVar (line 21) | randVar() {
    method currTmpVar (line 25) | currTmpVar() {
    method nextTmpVar (line 29) | nextTmpVar() {
    method transpile (line 33) | transpile(
    method wrapModule (line 39) | wrapModule(name: string, src: string): string {
    method moduleWrapper (line 53) | protected moduleWrapper({ src }: ModuleWrapperOptions) {

FILE: src/transpilers/js.ts
  class JSCompiler (line 4) | class JSCompiler extends BaseTranspiler {
    method moduleWrapper (line 5) | protected moduleWrapper({
    method transpile (line 14) | transpile(options: Partial<TranspilerOptions> = {}) {

FILE: src/transpilers/py.ts
  class PythonTranspiler (line 4) | class PythonTranspiler extends BaseTranspiler {
    method moduleWrapper (line 5) | protected moduleWrapper({
    method transpile (line 13) | transpile(options: Partial<TranspilerOptions> = {}) {

FILE: src/transpilers/rb.ts
  class RubyCompiler (line 4) | class RubyCompiler extends BaseTranspiler {
    method moduleWrapper (line 5) | protected moduleWrapper({
    method rename (line 13) | rename(name) {
    method lowerAllPinYinAndMakeItGlobal (line 17) | lowerAllPinYinAndMakeItGlobal(asc) {
    method transpile (line 87) | transpile(options: Partial<TranspilerOptions> = {}) {

FILE: src/typecheck.ts
  function printType (line 11) | function printType(t: IdenType, n = 0, d = 0): string {
  function printSignature (line 51) | function printSignature(signature: TypeSignature) {
  function typecheck (line 82) | function typecheck(asc: ASCNode[], assert = defaultAssert()) {

FILE: src/types.ts
  type TargetLanguages (line 1) | type TargetLanguages = "js" | "py" | "rb";
  type RomanizeSystem (line 2) | type RomanizeSystem = "none" | "pinyin" | "unicode" | "baxter";
  type LogCallback (line 3) | type LogCallback = (...args: any[]) => void;
  type CacheObject (line 4) | type CacheObject = Record<string, string>;
  type StandardLibraryObject (line 5) | type StandardLibraryObject = Record<string, string> &
  type CompileOnlyOptions (line 8) | interface CompileOnlyOptions {
  type ImportOptions (line 18) | interface ImportOptions {
  type CompileOptions (line 28) | type CompileOptions = CompileOnlyOptions & ImportOptions;
  type MarcoOptions (line 30) | interface MarcoOptions {
  type TranspilerOptions (line 36) | interface TranspilerOptions {
  type ExecuteOptions (line 40) | interface ExecuteOptions {
  type MacroDefinition (line 47) | type MacroDefinition = [string, string];
  type ImportedModule (line 49) | interface ImportedModule {
  type TokenType (line 55) | type TokenType =
  type Token (line 86) | type Token = [TokenType, string | undefined, number] | ["ans"];
  type ASCNodeCommon (line 88) | interface ASCNodeCommon {
  type ASCNodeOperator (line 92) | interface ASCNodeOperator {
  type ASCNodeReturn (line 98) | interface ASCNodeReturn {
  type ASCNodeIf (line 103) | interface ASCNodeIf {
  type ASCNodeFunction (line 110) | interface ASCNodeFunction {
  type ASCNodeWithValue (line 118) | interface ASCNodeWithValue {
  type ASCNodeName (line 123) | interface ASCNodeName {
  type ASCNodeReassign (line 128) | interface ASCNodeReassign {
  type ASCNodeCat (line 137) | interface ASCNodeCat {
  type ASCNodeFor (line 142) | interface ASCNodeFor {
  type ASCNodeCall (line 148) | interface ASCNodeCall {
  type ASCNodeLength (line 155) | interface ASCNodeLength {
  type ASCNodeTake (line 160) | interface ASCNodeTake {
  type ASCNodeTemp (line 165) | interface ASCNodeTemp {
  type ASCNodeImport (line 170) | interface ASCNodeImport {
  type ASCNodePush (line 176) | interface ASCNodePush {
  type ASCNodeWithError (line 182) | interface ASCNodeWithError {
  type ASCNodeSubscript (line 189) | interface ASCNodeSubscript {
  type ASCNodeVariable (line 195) | interface ASCNodeVariable {
  type ASCNodePropertry (line 204) | interface ASCNodePropertry {
  type ASCNodeGlobal (line 211) | interface ASCNodeGlobal {
  type ASCNodeEOF (line 215) | interface ASCNodeEOF {
  type ASCNodeSimple (line 219) | interface ASCNodeSimple {
  type ASCNode (line 237) | type ASCNode = ASCNodeCommon &
  function isASCNodeOperator (line 263) | function isASCNodeOperator(
  type IdenType (line 269) | interface IdenType {
  type TypeScope (line 279) | type TypeScope = Record<string, IdenType>;
  type TypeSignature (line 281) | type TypeSignature = [[number, number, number], TypeScope][];

FILE: src/utils.ts
  function match (line 4) | function match(src: string, startAt: number, target: string) {
  function isRoman (line 22) | function isRoman(x: string) {

FILE: static/assets/js/site.js
  function main (line 2) | function main() {

FILE: test/examples.test.ts
  function runExample (line 19) | async function runExample(lang, name, options = {}) {
  function runAll (line 49) | function runAll(

FILE: test/stdlib.math.test.cases.ts
  constant MIN_NORMAL_VALUE (line 1) | const MIN_NORMAL_VALUE = Number.MIN_VALUE / Number.EPSILON;
  constant MAX_POW_OF_2 (line 2) | const MAX_POW_OF_2 = Number.MAX_VALUE / (2 - Number.EPSILON);
  constant ROUND (line 6) | const ROUND = [
  constant SQRT (line 78) | const SQRT = [
  constant TRIG (line 328) | const TRIG = [
  constant ASIN_ACOS (line 2264) | const ASIN_ACOS = [
  constant ATAN (line 2888) | const ATAN = [
  constant TO_POLAR (line 3351) | const TO_POLAR = [
  constant EXP (line 4765) | const EXP = [
  constant LOG (line 5266) | const LOG = [
  constant POW (line 6141) | const POW = [

FILE: test/stdlib.wonton.test.ts
  function escape (line 15) | function escape(str: TemplateStringsArray) {

FILE: test/utils.ts
  type Options (line 7) | interface Options {
  function createTestUtil (line 14) | function createTestUtil(options: Partial<Options> = {}) {
  function compileLib (line 48) | function compileLib(name: string, options: Partial<CompileOptions> = {}) {
  function assertNumberEqual (line 70) | function assertNumberEqual(actual: number, expected: number, message?: s...
  function compareResults (line 83) | function compareResults(x: number | number[], y: number | number[]) {
  function isOnCorrectSide (line 101) | function isOnCorrectSide(
  function calcError (line 111) | function calcError(actual: number, expected: number | number[]) {
  function nearlyEqual (line 119) | function nearlyEqual(
  function assertNearlyEqual (line 165) | function assertNearlyEqual(

FILE: tools/examples.js
  function loadExamples (line 1) | function loadExamples() {

FILE: tools/make_calendar.js
  constant MONTH_FIX_START (line 31) | const MONTH_FIX_START = 57105;
  constant MONTH_FIX_TABLE (line 35) | const MONTH_FIX_TABLE = [
  constant LEAP_FIX_START (line 2529) | const LEAP_FIX_START = 1701;
  constant LEAP_FIX_TABLE (line 2533) | const LEAP_FIX_TABLE = [
  constant WENYAN_HEAD (line 2611) | const WENYAN_HEAD = `注曰「「此文程式之作文也。勿施以修訂。」」
  constant HTML_HEAD (line 2665) | const HTML_HEAD = `<!-- DOCTYPE html -->
  constant TABLE_HEAD (line 2698) | const TABLE_HEAD = `    <tr>
  constant HTML_TAIL (line 2715) | const HTML_TAIL = `  </table>
  constant CE_YEAR_OFFSET (line 2720) | const CE_YEAR_OFFSET = 2697;

FILE: tools/make_examples_readme.js
  function update (line 5) | function update(srcDir, outputFile) {

FILE: tools/publish.js
  function Build (line 22) | async function Build() {
  function CopyFiles (line 27) | async function CopyFiles() {
  function MakePackageJSON (line 39) | async function MakePackageJSON() {
  function Publish (line 65) | async function Publish() {

FILE: tools/test_parser.ts
  function readOtherExample (line 10) | function readOtherExample(x) {
  function runExample (line 14) | function runExample(lang, name) {
  function runAll (line 43) | function runAll(lang, skips = []) {

FILE: tools/utils.js
  function loadlib (line 5) | function loadlib(libDir = path.resolve(__dirname, "../lib/")) {
  function pyeval (line 19) | function pyeval(py) {
  function rbeval (line 28) | function rbeval(rb) {

FILE: tools/wiki/stdlib_cheatsheet.js
  constant HEAD (line 43) | const HEAD = `<!-- GENERATED FILE, DO NOT MODIFY-->
  constant BODY (line 46) | const BODY = `
  constant TAIL (line 54) | const TAIL = `
  function escapeMarkdown (line 69) | function escapeMarkdown(text) {
  function getLineIndexes (line 73) | function getLineIndexes(text) {
  function getLineNumberOfIndex (line 83) | function getLineNumberOfIndex(lines, index) {
  function readFile (line 91) | function readFile(filepath, relativePath) {
  function updateStdlibCheatsheet (line 137) | function updateStdlibCheatsheet(srcDir, outputFile) {

FILE: tools/wiki/update.js
  function ensureRepo (line 9) | function ensureRepo(url, dir) {
  function pushChanges (line 18) | function pushChanges(dir, msg) {

FILE: webpack.base.config.js
  function DtsBundlePlugin (line 41) | function DtsBundlePlugin(options){
  function _bundle (line 46) | function _bundle(options) {
Condensed preview — 151 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,431K chars).
[
  {
    "path": ".eslintrc.js",
    "chars": 420,
    "preview": "module.exports = {\n  parser: \"@typescript-eslint/parser\",\n  plugins: [\n    \"@typescript-eslint\",\n    \"jest\",\n  ],\n  pars"
  },
  {
    "path": ".gitattributes",
    "chars": 63,
    "preview": "site/* linguist-detectable=false\nsite linguist-detectable=false"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue.md",
    "chars": 349,
    "preview": "---\nname: Issue\nabout: Issue\ntitle: \"\"\n---\n\n<!-- \nPlease read our Contributing guide before you open the issue.\n\nhttps:/"
  },
  {
    "path": ".github/workflows/cdn.yml",
    "chars": 687,
    "preview": "name: Publish To CDN\n\non:\n  push:\n    branches: \n    - master\n\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    strategy:"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 580,
    "preview": "name: Publish Package\n\non:\n  release:\n    types: [created]\n\njobs:\n  publish-npm:\n    runs-on: ubuntu-latest\n    strategy"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 548,
    "preview": "name: Build & Test\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n    "
  },
  {
    "path": ".gitignore",
    "chars": 164,
    "preview": ".DS_Store\nnode_modules/\nbuild/wenyan-linux\nbuild/wenyan-macos\nbuild/wenyan-win.exe\ntemp\ndist\n/tools/calendar.html\n藏書樓\n.n"
  },
  {
    "path": ".npmrc",
    "chars": 32,
    "preview": "scripts-prepend-node-path=true\n\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 8727,
    "preview": "# v0.3.2\n\n## Features\n- Use modern js syntax for compiled code (PR #574, thanks @tsao-chi)\n- Improved error handling (#5"
  },
  {
    "path": "CNAME",
    "chars": 26,
    "preview": "wenyan-lang.lingdong.works"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3356,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 122,
    "preview": "# Contributing\n\nPlease check out the contributing guide on [wiki](https://github.com/wenyan-lang/wenyan/wiki/Contributin"
  },
  {
    "path": "LICENSE",
    "chars": 1079,
    "preview": "MIT License\n\nCopyright (c) 2019-present Lingdong Huang\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "Makefile",
    "chars": 136,
    "preview": "all: ide cmdline\nide:\n\tcd tools; node make_ide.js;\ncmdline:\n\tcd tools; node make_cmdline.js;\nclean: \n\trm -f site/ide.htm"
  },
  {
    "path": "README.md",
    "chars": 8488,
    "preview": "<img src=\"screenshots/logo.png\" align=\"right\" width=\"128\" height=\"128\"/>\n\n# 文言 wenyan-lang\n\n[![npm](https://img.shields."
  },
  {
    "path": "README.zh-Hans.md",
    "chars": 8697,
    "preview": "<img src=\"screenshots/logo.png\" align=\"right\" width=\"100\" height=\"100\"/>\n\n# 文言 wenyan-lang\n\n### [wy-lang.org](https://wy"
  },
  {
    "path": "README.zh-Hant.md",
    "chars": 8727,
    "preview": "<img src=\"screenshots/logo.png\" align=\"right\" width=\"100\" height=\"100\"/>\n\n# 文言 wenyan-lang\n\n### [wy-lang.org](https://wy"
  },
  {
    "path": "documentation/Compiler-API.md",
    "chars": 98,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Compiler-API)"
  },
  {
    "path": "documentation/Importing.md",
    "chars": 95,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Importing)"
  },
  {
    "path": "documentation/Macros.md",
    "chars": 92,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Macros)"
  },
  {
    "path": "documentation/Nested-Function-Calls.md",
    "chars": 99,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Function-Call)"
  },
  {
    "path": "documentation/PREFACE.md",
    "chars": 2275,
    "preview": "> 夫[唐](https://en.wikipedia.org/wiki/Emperor_Yao)、[虞](https://en.wikipedia.org/wiki/Emperor_Shun)之世,[結繩而足治](https://ctex"
  },
  {
    "path": "documentation/Runtime.md",
    "chars": 100,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Brower-Runtime)"
  },
  {
    "path": "documentation/Standard-Lib.md",
    "chars": 113,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Standard-Library-Cheatsheet)"
  },
  {
    "path": "documentation/TODO.md",
    "chars": 321,
    "preview": "- ~~multiple push to array~~\n- ~~syntax highlighting~~\n- auto indent / format\n- ~~compile to python~~\n- compile to c\n- ~"
  },
  {
    "path": "documentation/Testing.md",
    "chars": 93,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Testing)"
  },
  {
    "path": "documentation/Try-Catch.md",
    "chars": 100,
    "preview": "This document is moved to [the wiki page](https://github.com/wenyan-lang/wenyan/wiki/Error-Handling)"
  },
  {
    "path": "documentation/wenyan.g4",
    "chars": 5396,
    "preview": "grammar wenyan;\nprogram                     : statement* ;\nstatement                   : declare_statement\n             "
  },
  {
    "path": "examples/README.md",
    "chars": 3325,
    "preview": "<!-- GENERATED FILE, DO NOT MODIFY -->\n<!-- \"npm run build:docs\" to regenerate -->\n\n# Examples\n\n| File                  "
  },
  {
    "path": "examples/beer.wy",
    "chars": 150,
    "preview": "吾有一言。曰「「春日宴。」」。書之。\n有數九。名之曰「酒數」。\n\n恆為是。若「酒數」等於零者乃止也。\n\n\t吾有三言。曰「「與君」」。曰「酒數」。\n\t\t曰「「杯酒。可以窮歡宴。綠酒一杯歌一遍。」」。書之。\n\n減「酒數」以一。昔之「酒數」者。今"
  },
  {
    "path": "examples/breadth_first_search.wy",
    "chars": 993,
    "preview": "注曰。「「廣度優先搜索」」。\n\n吾有一數。曰五。名之曰「長」。\t注曰。「「節點的數量」」。\n吾有一列。名之曰「橋」。 注曰。「「鄰接數組」」。\n\n吾有二數。曰一。曰五。名之曰「開始」曰「終點」。\n\n注曰。「「相鄰節點。\n一到二。一到三。\n二"
  },
  {
    "path": "examples/clock.wy",
    "chars": 2664,
    "preview": "吾嘗觀「「曆法」」之書。方悟「今何紀元時」「彼時何小時」「彼刻何刻」「彼分何分」「彼秒何秒」之義。\n吾嘗觀「「畫譜」」之書。方悟「備紙」「擇筆」「蘸色」「落筆」「運筆」「提筆」「設色」「裱畫」之義。\n吾嘗觀「「算經」」之書。方悟「倍圓周率」"
  },
  {
    "path": "examples/collatz.wy",
    "chars": 373,
    "preview": "吾有一術。名之曰「角谷猜想」。\n欲行是術。必先得一數。\n曰「甲」。\n乃行是術曰。\n\t吾有一術。名之曰「助手」。\n\t欲行是術。必先得一數。\n\t曰「乙」。\n\t乃行是術曰。\n\t\t吾有一數。名之曰「埃」。\n\t\t除「乙」以二。所餘幾何。名之曰「積」。"
  },
  {
    "path": "examples/collatz2.wy",
    "chars": 321,
    "preview": "吾有一術。名之曰「考拉茲」。欲行是術。必先得一數。曰「甲」。乃行是術曰。\n\t有數零。名之曰「總」。\n\t為是九千九百九十九遍。\n\t\t若「甲」等於一者。乃得「總」。\n\t\t若非。\n\t\t\t除「甲」以二。所餘幾何。名之曰「丙」。\n\t\t\t若「丙」等於零"
  },
  {
    "path": "examples/crt.wy",
    "chars": 2906,
    "preview": "吾有一術。名之曰「大衍總數」。欲行是術。必先得二列。曰「諸元」。曰「諸餘」。乃行是術曰。\n注曰「「\n\t以定相乘為衍母。\n\t以各定約衍母。得各衍數。\n\t諸衍數。各滿定母去之。不滿曰奇。\n\t以奇與定。用大衍求一入之。以求乘率。\n\t置各乘率。對乘"
  },
  {
    "path": "examples/divination.wy",
    "chars": 1099,
    "preview": "吾嘗觀「「易經」」之書。方悟「占」「運」之義。\n吾嘗觀「「算經」」之書。方悟「取底」之義。\n\n施「運」於十三。\n\n吾有一術。名之曰「听天由命」。欲行是術。必先得一數。曰「甲」。乃行是術曰。\n\t施「占」。名之曰「乙」。乘「甲」以「乙」。名之曰"
  },
  {
    "path": "examples/draw_heart.wy",
    "chars": 804,
    "preview": "吾嘗觀「「算經」」之書。方悟「絕對」「平方根」之義。\n\n吾有一術名之曰「畫心」。\n欲行是術。必先得一言。曰「心語」。\n乃行是術曰。\n\t夫「心語」之長。名之曰「長度」。\n\t吾有一言。曰「「一」」。名之曰「填充符」。\n\t吾有一言。曰「「\\n」」"
  },
  {
    "path": "examples/eightqueens.wy",
    "chars": 742,
    "preview": "注曰。「「今以八皇后置棋盤之上而不相殺。其法幾何。」」\n\n吾有一術。名之曰「皇后問題」。欲行是術。必先得一數。曰「寬」。乃行是術曰。\n\t吾有一列。名之曰「棋盤」。\n\n\t吾有一術。名之曰「單步」。是術曰。\n\t\t若「棋盤」之長等於「寬」者。\n\t"
  },
  {
    "path": "examples/euclidean.wy",
    "chars": 713,
    "preview": "吾有一術。名之曰「歐幾里得法」。\n欲行是術。必先得二數。\n曰「甲」。曰「乙」。\n乃行是術曰。\n\t\t吾有一數。名之曰「回」。\n\t\t若「乙」等於零者。乃得「甲」是矣。\n\t\t若非\n\t\t\t吾有一數。名之曰「削除」。\n\t\t\t除「甲」以「乙」所餘幾何。"
  },
  {
    "path": "examples/factorial.wy",
    "chars": 152,
    "preview": "吾有一術。名之曰「階乘」。欲行是術。必先得一數。曰「甲」。乃行是術曰。\n\t若「甲」等於一者。\n\t\t乃得「甲」。\n\t若非。\n\t\t減「甲」以一。名之曰「乙」。\n\t\t施「階乘」於「乙」。名之曰「丙」。\n\t\t乘「丙」以「甲」。名之曰「丁」。\n\t\t乃"
  },
  {
    "path": "examples/fibonacci.wy",
    "chars": 190,
    "preview": "吾有一術。名之曰「斐波那契」。欲行是術。必先得一數。曰「甲」。乃行是術曰。\n\t若「甲」等於零者乃得零也\n\t若「甲」等於一者乃得一也\n\t減「甲」以一。減「甲」以二。名之曰「乙」。曰「丙」。\n\t施「斐波那契」於「乙」。名之曰「丁」。\n\t施「斐波"
  },
  {
    "path": "examples/fibonacci2.wy",
    "chars": 300,
    "preview": "吾有一術。名之曰「斐氏列」。\n\n欲行是術。必先得一數。曰「因」。乃行是術曰。\n\t\t有數零。名之曰「頭」。\n\t有數一。名之曰「尾」。\n\t\t有數一。名之曰「計」。\n\t有數零。名之曰「果」。\n\n\t若「因」等於零者。昔之「果」者。今「因」是矣云云。"
  },
  {
    "path": "examples/fibonacci_array.wy",
    "chars": 276,
    "preview": "吾有一術。名之曰「斐氏列」。\n欲行是術。必先得一數。曰「限」。乃行是術曰。\n\t有數零。名之曰「計」。\n\t吾有一列。名之曰「斐氏列」。\n\t為是「限」遍。\n\t\t若「計」小於二者。\n\t\t\t充「斐氏列」以「計」。\n\t\t若非。\n\t\t\t減「計」以一。名"
  },
  {
    "path": "examples/fizzbuzz.wy",
    "chars": 279,
    "preview": "有數一。名之曰「戊」。恆為是。\n\n\t除「戊」以三。所餘幾何。變其。名之曰「三餘」。\n\t除「戊」以五。所餘幾何。變其。名之曰「五餘」。\n\n\t夫「三餘」「五餘」中有陽乎。變其。名之曰「寂」。\n\t若「寂」者。吾有一言。曰「戊」。書之。\n\t若非。\n"
  },
  {
    "path": "examples/hanoi.wy",
    "chars": 887,
    "preview": "吾有一術。名之曰「漢諾塔」。欲行是術。必先得四數。曰「盤數」。曰「甲塔」。曰「乙塔」。曰「丙塔」。\n乃行是術曰。\n\t若「盤數」等於零者。吾有一列。乃得其也。\n\t減「盤數」以一。昔之「盤數」者。今其是矣。\n\t施「漢諾塔」於「盤數」。於「甲塔」"
  },
  {
    "path": "examples/hanoi_stack.wy",
    "chars": 3446,
    "preview": "吾有一術。名之曰「漢諾塔」。\n欲行是術。必先得四數。曰「盤數」。曰「起」。曰「過」。曰「訖」。乃行是術曰。\n\t吾有五言。曰「「天竺有一漢諾塔。初置」」。曰「盤數」。曰「「金盤於柱」」。曰「起」。曰「「。」」。書之。\n\t吾有五言。曰「「欲盡其"
  },
  {
    "path": "examples/helloworld+.wy",
    "chars": 49,
    "preview": "吾有一數。曰三。名之曰「甲」。\n為是「甲」遍。\n\t吾有一言。曰「「問天地好在。」」。書之。\n云云。"
  },
  {
    "path": "examples/helloworld.wy",
    "chars": 20,
    "preview": "吾有一言。曰「「問天地好在。」」。書之。"
  },
  {
    "path": "examples/import.wy",
    "chars": 321,
    "preview": "吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」「圓周率」「取底」「取整」「取頂」「正負」「絕對」之義。\n吾嘗觀「「曆法」」之書。方悟「言今之日時」之義。\n吾嘗觀「「易經」」之書。方悟「占」之義。\n吾嘗觀「「helloworld」」之書。\n\n施"
  },
  {
    "path": "examples/linglong_tower.wy",
    "chars": 975,
    "preview": "吾有一言。曰「「繞口令  玲瓏塔」」。書之。\n\n吾有一術。名之曰「數玲瓏塔」。\n欲行是術。必先得一數。曰「層」。乃行是術曰。\n\n\t若「層」等於三者。\n    \t吾有一言。曰「「玲瓏塔。塔玲瓏。接過了二層數 三 層。」」。書之。\n    若非"
  },
  {
    "path": "examples/macro.wy",
    "chars": 508,
    "preview": "或云「「書「甲」焉」」。\n蓋謂「「吾有一言。曰「甲」。書之」」。\n\n書「「問天地好在」」焉。\n\n注曰「「書「「問天地好在」」焉。」」\n疏曰「「凡居「「」」與『』中之宏。不予展開」」\n\n吾嘗觀「「列經」」之書。方悟「遍施」「篩剔」「左併」之義"
  },
  {
    "path": "examples/mandelbrot.wy",
    "chars": 876,
    "preview": "吾有一術。名之曰「曼德博」。欲行是術。必先得二數。曰「寬」。曰「高」。乃行是術曰。\n\t批曰。「「曼德博集。亦稱曼德布洛特复数集合。复平面上组成分形之点之集合也。」」\n\n\t吾有一言。曰「「丁龘蠹臺龜畫龍淼蔑高五三二」」。名之曰「皴法」。\n\t批"
  },
  {
    "path": "examples/mergesort.wy",
    "chars": 1008,
    "preview": "吾有一術。名之曰「歸併」。欲行是術。必先得二列。曰「甲」。曰「乙」。\n乃行是術曰。\n\t若「甲」之長等於零者。乃得「乙」也。\n\t若「乙」之長等於零者。乃得「甲」也。\n\n\t吾有二數。曰一。曰一。名之曰「甲引」。曰「乙引」。\n\t吾有一列。名之曰「"
  },
  {
    "path": "examples/misc.wy",
    "chars": 867,
    "preview": "吾有一言。曰「「問天地好在。」」。書之。\n有數三十。名之曰「甲」。\n吾有三言。曰「「甲之數」」。曰「甲」。曰「「也」」。書之。\n\n批曰。「「文氣淋灕。字句切實」」。\n\n吾有二爻。曰陽。曰陰。名之曰「天」。曰「地」。\n夫「天」「地」中無陰乎。"
  },
  {
    "path": "examples/modinv.wy",
    "chars": 680,
    "preview": "吾有一術。名之曰「大衍求一」。欲行是術。必先得二數。曰「奇」。曰「定」。乃行是術曰。\n注曰「「\n\t大衍求一術云。\n\t置奇右上。定居右下。立天元一於左上。\n\t先以右上除右下。所得商數與左上一相生。入左下。然後乃以右行上下。\n\t以少除多。遞互除"
  },
  {
    "path": "examples/multiplication_table.wy",
    "chars": 268,
    "preview": "吾有一術名之曰「乘算口訣」。是術曰。\n\t有數一名之曰「甲」。\n\t恆為是。若「甲」不小於十者乃止也。\n\t\t有數一名之曰「乙」。\n\t\t加「甲」以「乙」名之曰「丙」。\n\t\t恆為是。若「乙」不小於「丙」者乃止也。\n\t\t\t\t乘「甲」以「乙」名之曰「果"
  },
  {
    "path": "examples/nested_fun.wy",
    "chars": 536,
    "preview": "有數三。名之曰「甲」。\n有數四。名之曰「乙」。\n有數五。名之曰「丙」。\n吾有一列。名之曰「癸」。充「癸」以一以二以三。\n\n吾有一術。名之曰「丁」。欲行是術。必先得三數。曰「寅」曰「卯」曰「辰」乃行是術曰。\n\t乃得一。\n是謂「丁」之術也。\n\n"
  },
  {
    "path": "examples/obj.wy",
    "chars": 320,
    "preview": "吾有一物。名之曰「精衛」。其物如是。\n\t物之「「名」」者。言曰「「女娃」」。\n\t物之「「足數」」者。數曰二。\n\t物之「「喙數」」者。數曰一。\n是謂「精衛」之物也。\n\n吾有一術。名之曰「造物之術」。欲行是術。必先得一言。曰「甲」。乃行是術曰。"
  },
  {
    "path": "examples/pascal_triangle.wy",
    "chars": 508,
    "preview": "吾有一術。名之曰「賈憲三角」。欲行是術。必先得一數。曰「層數」。乃行是術曰。\n\t吾有一列。名之曰「前層之得」。\n\t充「前層之得」以一。夫「前層之得」。書之。\n\t若「層數」等於一者乃歸空無也。\n\n\t充「前層之得」以一。夫「前層之得」。書之。\n"
  },
  {
    "path": "examples/pi_leibniz.wy",
    "chars": 372,
    "preview": "吾有一術。名之曰「萊布尼茲圓周率估算」。\n欲行是術。必先得一數。\n曰「頂」。\n乃行是術曰。\n\t吾有三數。名之曰「埃」曰「積」曰「畸」。\n\t有數一。名之曰「符」。\n\t恆為是。\n\t\t若「埃」大於「頂」者,乃止也。\n\t\t乘二於「埃」,名之曰「畸」"
  },
  {
    "path": "examples/pi_liuhui.wy",
    "chars": 628,
    "preview": "注曰「「割圓術始載於劉徽所著九章算術注」」\n\n吾嘗觀「「算經」」之書。方悟「冪」「平方根」之義。\n\n吾有一數。曰一。名之曰「半徑」。\n乘「半徑」以「半徑」。名之曰「半徑平方」。\n\n吾有一術。名之曰「求小弦」。欲行是術。必先得二數。曰「裏觚之"
  },
  {
    "path": "examples/quicksort.wy",
    "chars": 349,
    "preview": "吾有一術。名之曰「快排」。欲行是術。必先得一列。曰「甲」。乃行是術曰。\n\t若「甲」之長不大於一者。\n\t\t乃得「甲」\n\t也。\n\t吾有三列。名之曰「首」。曰「頷」。曰「尾」。\n\n\t夫「甲」之一。名之曰「甲一」。\n\t充「頷」以「甲一」。\n\t夫「甲"
  },
  {
    "path": "examples/quicksort_inplace.wy",
    "chars": 874,
    "preview": "吾有一術。名之曰「降龍十八掌」。欲行是術。必先得二數。曰「少陽」。曰「老陽」。一列。曰「陰」。\n是術曰。\n\t若「少陽」不小於「老陽」者。\n\t\t乃得陰。\n\t也。\n\t吾有一數。名之曰「太極」。\n\t施「一陽指」於「少陽」。於「老陽」。於「陰」。昔"
  },
  {
    "path": "examples/quine.wy",
    "chars": 1309,
    "preview": "注曰Reference: 注曰https://qiita.com/amoO_O/items/5d0c4edfc99f64bea6fb\n吾有一術。名之曰「自己複製」。欲行是術。是術曰。吾有一術。名之曰「置換」。欲行是術。必先得三數。曰「文字列"
  },
  {
    "path": "examples/quine2.wy",
    "chars": 1945,
    "preview": "注曰Reference: 注曰https://qiita.com/amoO_O/items/5d0c4edfc99f64bea6fb\n吾有一術。名之曰「自己複製」。\n欲行是術。是術曰。\n\n吾有一術。名之曰「置換」。\n欲行是術。必先得三數。\n"
  },
  {
    "path": "examples/selectionsort.wy",
    "chars": 525,
    "preview": "吾有一術。名之曰「擇排」。欲行是術。必先得一列。曰「數列」。乃行是術曰。\n\t吾有一列。名之曰「答列」。\n\t夫「數列」之長。名之曰「度」。\n\t為是「度」遍。\n\t\t夫「數列」之一。名之曰「若者」。\n\t\t吾有一數。曰一。名之曰「若者之位」。\n\t\t"
  },
  {
    "path": "examples/serialization.wy",
    "chars": 609,
    "preview": "吾嘗觀「「渾沌經」」之書。方悟「包渾沌」「食渾沌」之義。\n\n吾有一言。曰「「\\\n\t物\\\n\t\t之「名」言「李白」\\\n\t\t之「字」言「太白」\\\n\t\t之「號」言「青蓮」\\\n\t\t之「壽考」數「六一」\\\n\t\t之「生年」言「長安元年」\\\n\t\t之「卒年」"
  },
  {
    "path": "examples/sieve.wy",
    "chars": 413,
    "preview": "吾有一術。名之曰「埃氏篩」。欲行是術。必先得一數。曰「甲」。乃行是術曰。\n\t吾有一列。名之曰「掩」。為是「甲」遍。充「掩」以陽也。\n\t除「甲」以二。名之曰「甲半」。\n\n\t有數二。名之曰「戊」。恆為是。若「戊」不小於「甲半」者乃止也。\n\t\t有"
  },
  {
    "path": "examples/sqrt_newton.wy",
    "chars": 307,
    "preview": "吾有一術。名之曰「牛頓求根法」。\n欲行是術。必先得一數。\n曰「試」。\n乃行是術曰。\n\t\t有數一。名之曰「甲」。\n\t有數一。名之曰「乙」。\n\t為是「試」遍。\n\t\t乘「甲」於「甲」,名之曰「乙」。減「乙」以二,名之曰「乙」\n\t\t乘二於「甲」,名"
  },
  {
    "path": "examples/tree.wy",
    "chars": 582,
    "preview": "吾嘗觀「「畫譜」」之書。方悟「備紙」「擇筆」「蘸色」「落筆」「運筆」「提筆」「裱畫」之義。\n吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」「半圓周率」之義。\n\n吾有一術。名之曰「畫樹法」。欲行是術。必先得一物。曰「紙」。\n五數。曰「東」曰「南"
  },
  {
    "path": "examples/tree2.wy",
    "chars": 1580,
    "preview": "吾嘗觀「「畫譜」」之書。方悟「備紙」「擇筆」「蘸色」「落筆」「運筆」「提筆」「裱畫」之義。\n吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」「半圓周率」「四分圓周率」之義。\n吾嘗觀「「易經」」之書。方悟「運」「占」之義。\n\n施「運」於十六。\n\n"
  },
  {
    "path": "examples/try.wy",
    "chars": 333,
    "preview": "\n姑妄行此。\n\t嗚呼。「「滅頂」」之禍。\n\n如事不諧。豈「「虛指」」之禍歟。\n\t吾有一言。曰「「本無此物。奈何用之」」。書之。\n\n豈「「文法」」之禍歟。\n\t吾有一言。曰「「不合文法。不通之甚」」。書之。\n\n豈「「異類」」之禍歟。\n\t吾有一言"
  },
  {
    "path": "examples/turing.wy",
    "chars": 1409,
    "preview": "吾有一術。名之曰「圖靈機」。欲行是術。必先得一列。曰「諸律」。二言。曰「始態」。曰「終態」。\n乃行是術曰。\n\t吾有一列。名之曰「帶」。充「帶」以「「白」」。\n\t有數一。名之曰「針」。\n\n\t吾有二數。曰一。曰一。名之曰「左疆」。曰「右疆」。\n"
  },
  {
    "path": "examples/zh_sqrt.wy",
    "chars": 773,
    "preview": "吾嘗觀『算經』之書。方悟「取底除」之義。\n\n吾有一術。名之曰「增乘開平方」。欲行是術。必先得一數。曰「實」。乃行是術曰。\n\t注曰。『增乘開平方法,以商數乘下法遞增求之。』。\n\t吾有四數。名之曰「果」曰「商」曰「餘」曰「廉」。有數一。名之曰「"
  },
  {
    "path": "jest.config.js",
    "chars": 246,
    "preview": "module.exports = {\n  roots: [\n    '<rootDir>/test',\n  ],\n  testMatch: [\n    '**/__tests__/**/*.+(ts|tsx|js)',\n    '**/?("
  },
  {
    "path": "lib/js/位經.wy",
    "chars": 900,
    "preview": "疏曰「「左移。同犀之x<<y也。」」\n今有一術。名之曰「左移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。\n\t施「(x=>y=>(x<<y))」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。\n是謂「左移」之術也。\n\n疏曰「「右移"
  },
  {
    "path": "lib/js/天地經.wy",
    "chars": 110,
    "preview": "今有一言。曰「「犀」」。名之曰「境」。\n\n注曰「「鑒。同Javascript之eval也。」」\n今有一術。名之曰「鑒」。欲行是術。必先得一言。曰「言」。乃行是術曰。\n\t施「eval」於「言」。乃得矣。\n是謂「鑒」之術也。"
  },
  {
    "path": "lib/js/格物.wy",
    "chars": 440,
    "preview": "\n今有一術。名之曰「取物」。欲行是術。必先得一物曰「物」。一言曰「端」。乃行是術曰。\n\t施「(obj=>x=>obj[x])」於「物」於「端」。乃得矣。\n是謂「取物」之術也。\n\n今有一術。名之曰「置物」。欲行是術。必先得一物曰「物」。一言曰"
  },
  {
    "path": "lib/js/畫譜.wy",
    "chars": 2629,
    "preview": "吾有一列。名之曰「色表」。充「色表」\n以「「黑」」。\t以「「#000000」」。\n以「「鈦白」」。\t以「「#ffffff」」。\n以「「藤黃」」。\t以「「#faea56」」。\n以「「硃磦」」。\t以「「#d44906」」。\n以「「硃砂」」。\t以"
  },
  {
    "path": "lib/js/西曆法.wy",
    "chars": 188,
    "preview": "今有一術。名之曰「紀元時」。是術曰。\n\t施「(()=>new Date().getTime()/1000)」。乃得矣。\n是謂「紀元時」之術也。\n\n今有一術。名之曰「時差」。欲行是術。必先得一數。曰「時」。乃行是術曰。\n\t施「(x => 0 "
  },
  {
    "path": "lib/py/位經.wy",
    "chars": 877,
    "preview": "今有一術。名之曰「左移」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。\n\t吾有一術。名之曰\n\t施「(lambda x: lambda y : x<<y)」於「甲」。於「乙」。名之曰「丙」。乃得「丙」。\n是謂「左移」之術也。\n\n今有"
  },
  {
    "path": "lib/py/天地經.wy",
    "chars": 83,
    "preview": "今有一言。曰「「蟒」」。名之曰「境」。\n\n今有一術。名之曰「鑒」。欲行是術。必先得一言。曰「言」。乃行是術曰。\n\t施「eval」於「言」。乃得矣。\n是謂「鑒」之術也。"
  },
  {
    "path": "lib/py/西曆法.wy",
    "chars": 222,
    "preview": "\n今有一術。名之曰「紀元時」。是術曰。\n\t施「__import__」於「「time」」。名之曰「time」。\n\t施「time.time」。乃得矣。\n是謂「紀元時」之術也。\n\n今有一術。名之曰「時差」。欲行是術。必先得一數。曰「時」。乃行是術"
  },
  {
    "path": "lib/rb/天地經.wy",
    "chars": 83,
    "preview": "今有一言。曰「「鑽」」。名之曰「境」。\n\n今有一術。名之曰「鑒」。欲行是術。必先得一言。曰「言」。乃行是術曰。\n\t施「eval」於「言」。乃得矣。\n是謂「鑒」之術也。"
  },
  {
    "path": "lib/列經.wy",
    "chars": 1854,
    "preview": "或云「「凡「甲」皆「乙」其上者」」。\n蓋謂「「施「遍施」於「乙」於「甲」」」\n\n或云「「唯「甲」中得「乙」者」」\n蓋謂「「施「篩剔」於「乙」於「甲」」」\n\n或云「「併「甲」於「乙」以「丙」者」」\n蓋謂「「施「左併」於「丙」於「乙」於「甲」」"
  },
  {
    "path": "lib/易經.wy",
    "chars": 453,
    "preview": "吾有一數。曰四十二。名之曰「運數」。\n\n注曰「「運。同Javascript之set random seed也。」」\n今有一術。名之曰「運」。欲行是術。必先得一數。曰「甲」。乃行是術曰。\n\t注曰「「運者。隨機種子也」」\n\t昔之「運數」者。今「"
  },
  {
    "path": "lib/曆法.wy",
    "chars": 10024,
    "preview": "吾嘗觀「「西曆法」」之書。方悟「紀元時」「時差」之義。\n吾嘗觀「「曆表」」之書。方悟「始曆月」「曆月表」「始閏月」「閏月表」之義。\n吾嘗觀「「算經」」之書。方悟「取底除」「取整除」「取底」「取頂」「取整」之義。\n\n注曰「「今之年月日時刻者。"
  },
  {
    "path": "lib/曆表.wy",
    "chars": 5701,
    "preview": "注曰「「此文程式之作文也。勿施以修訂。」」\n注曰「「程式書於文 tools/make_calendar.js 」」\n\n今有一數。曰五七一〇五。名之曰「始曆月」。\n今有一列。名之曰「曆月表」。\n今有一數。曰一七〇一。名之曰「始閏月」。\n今有一"
  },
  {
    "path": "lib/渾沌經.wy",
    "chars": 5325,
    "preview": "吾嘗觀「「格物」」之書。方悟「取物」「置物」「列物之端」「識類」之義。\n\n吾有一言。曰「「「」」」。名之曰「引號」。\n夫「引號」之一。名之曰「引起」。\n夫「引號」之二。名之曰「引迄」。\n吾有一列。名之曰「位名」。充「位名」\n以「「〇」」以「"
  },
  {
    "path": "lib/算經.wy",
    "chars": 25251,
    "preview": "吾有二數。曰一。曰一。名之曰「進制」。曰「退制」。\n吾有三數。曰零。曰一。曰一。名之曰「總算位」。曰「上位冪」。曰「下位冪」。\n吾有三數。曰零。曰一。曰一。名之曰「至大指」。曰「巨位冪」。曰「至巨數」。\n吾有三數。曰零。曰一。曰一。名之曰「"
  },
  {
    "path": "lib/籌經.wy",
    "chars": 472,
    "preview": "注曰「「求和。同Javascript之reduce((a,b)=>a+b)也。」」\n今有一術。名之曰「求和」。欲行是術。必先得一列。曰「列」。乃行是術曰。\n吾有一數。曰零。名之曰「和」。凡「列」中之「數」。加「和」以「數」。\n昔之「和」者,"
  },
  {
    "path": "netlify.toml",
    "chars": 117,
    "preview": "[[headers]]\n  for = \"/__migrate__\"\n    [headers.values]\n      Access-Control-Allow-Origin = \"https://ide.wy-lang.org\""
  },
  {
    "path": "package.json",
    "chars": 3149,
    "preview": "{\n  \"name\": \"wenyanlang\",\n  \"description\": \"文言 A programming language for the ancient Chinese\",\n  \"version\": \"0.4.0\",\n  "
  },
  {
    "path": "site/CNAME",
    "chars": 26,
    "preview": "wenyan-lang.lingdong.works"
  },
  {
    "path": "site/ide.html",
    "chars": 349,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta http-equiv=\"Refresh\" content=\"0; url=http://wy-"
  },
  {
    "path": "site/index.html",
    "chars": 337,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta http-equiv=\"Refresh\" content=\"0; url=http://wy-"
  },
  {
    "path": "src/browser_runtime.ts",
    "chars": 1171,
    "preview": "import { execute } from \"./parser\";\n\n(() => {\n  const isDev = false;\n\n  async function run(script) {\n    const scoped = "
  },
  {
    "path": "src/cli.ts",
    "chars": 9523,
    "preview": "import fs from \"fs\";\nimport path from \"path\";\nimport commander from \"commander\";\nimport findUp from \"find-up\";\nimport { "
  },
  {
    "path": "src/converts/hanzi2num.ts",
    "chars": 25209,
    "preview": "export enum NumberTokenType {\n  SIGN, // 負\n  DIGIT, // 一二三...\n  DECIMAL, // ·\n  INT_MULT, // 十百千萬億...\n  FRAC_MULT, // 分釐"
  },
  {
    "path": "src/converts/hanzi2pinyin.ts",
    "chars": 743,
    "preview": "import { RomanizeSystem } from \"../types\";\nimport pinyin from \"./hanzi2roman-map-pinyin.json\";\nimport baxter from \"./han"
  },
  {
    "path": "src/converts/hanzi2roman-map-baxter.json",
    "chars": 138621,
    "preview": "{\n  \"3431\":\"tsyinX\",\n  \"3444\":\"mjuX\",\n  \"3547\":\"lop\",\n  \"3559\":\"tshwin tswinH\",\n  \"3563\":\"ywenX\",\n  \"3583\":\"xuwH xuwX\",\n"
  },
  {
    "path": "src/converts/hanzi2roman-map-pinyin.json",
    "chars": 478126,
    "preview": "{\n  \"3400\":\"QIU1\",\n  \"3401\":\"TIAN3 TIAN4\",\n  \"3404\":\"KUA4\",\n  \"3405\":\"WU3\",\n  \"3406\":\"YIN3\",\n  \"3416\":\"YE4\",\n  \"3421\":\"N"
  },
  {
    "path": "src/execute.ts",
    "chars": 1433,
    "preview": "import { TargetLanguages, LogCallback, ExecuteOptions } from \"./types\";\nimport { num2hanzi, bool2hanzi } from \"./parser\""
  },
  {
    "path": "src/highlight.js",
    "chars": 4646,
    "preview": "var { num2hanzi } = require(\"./converts/hanzi2num\");\nvar { NUMBER_KEYWORDS, KEYWORDS } = require(\"./keywords\");\n\nvar DEF"
  },
  {
    "path": "src/keywords.ts",
    "chars": 2745,
    "preview": "import { TokenType } from \"./types\";\n\nexport const NUMBER_KEYWORDS = Array.from(\n  \"負·又零〇一二三四五六七八九十百千萬億兆京垓秭穰溝澗正載極分釐毫絲忽微纖"
  },
  {
    "path": "src/macro.ts",
    "chars": 4543,
    "preview": "import { MarcoOptions, MacroDefinition } from \"./types\";\nimport { bundleImports } from \"./reader\";\nimport { match } from"
  },
  {
    "path": "src/parser.ts",
    "chars": 22281,
    "preview": "import {\n  CompileOptions,\n  ASCNode,\n  Token,\n  TokenType,\n  RomanizeSystem,\n  ExecuteOptions\n} from \"./types\";\nimport "
  },
  {
    "path": "src/reader.ts",
    "chars": 3718,
    "preview": "import {\n  ImportOptions,\n  CacheObject,\n  CompileOptions,\n  ImportedModule\n} from \"./types\";\n\nconst INDEX_FILENAME = \"序"
  },
  {
    "path": "src/render.ts",
    "chars": 9791,
    "preview": "import { semantic } from \"./highlight\";\nimport { num2hanzi } from \"./converts/hanzi2num\";\nimport { wy2tokens, compile } "
  },
  {
    "path": "src/stdlib.ts",
    "chars": 641,
    "preview": "import { StandardLibraryObject } from \"./types\";\n\nfunction loadStdlib() {\n  const STDLIB = {};\n\n  try {\n    const raw = "
  },
  {
    "path": "src/transpilers/base.ts",
    "chars": 1173,
    "preview": "import { ASCNode, TranspilerOptions } from \"../types\";\n\nexport interface ModuleWrapperOptions {\n  src: string;\n  moduleN"
  },
  {
    "path": "src/transpilers/index.ts",
    "chars": 286,
    "preview": "import JS from \"./js\";\nimport PY from \"./py\";\nimport RB from \"./rb\";\nimport { TargetLanguages } from \"../types\";\nimport "
  },
  {
    "path": "src/transpilers/js.ts",
    "chars": 9922,
    "preview": "import { BaseTranspiler, ModuleWrapperOptions } from \"./base\";\nimport { TranspilerOptions, ASCNodeOperator } from \"../ty"
  },
  {
    "path": "src/transpilers/py.ts",
    "chars": 12603,
    "preview": "import { BaseTranspiler, ModuleWrapperOptions } from \"./base\";\nimport { TranspilerOptions, ASCNodeOperator } from \"../ty"
  },
  {
    "path": "src/transpilers/rb.ts",
    "chars": 11539,
    "preview": "import { BaseTranspiler, ModuleWrapperOptions } from \"./base\";\nimport { TranspilerOptions, ASCNodeOperator } from \"../ty"
  },
  {
    "path": "src/typecheck.ts",
    "chars": 19153,
    "preview": "import {\n  ASCNode,\n  isASCNodeOperator,\n  Token,\n  IdenType,\n  TypeSignature,\n  TypeScope\n} from \"./types\";\nimport { de"
  },
  {
    "path": "src/types.ts",
    "chars": 4952,
    "preview": "export type TargetLanguages = \"js\" | \"py\" | \"rb\";\nexport type RomanizeSystem = \"none\" | \"pinyin\" | \"unicode\" | \"baxter\";"
  },
  {
    "path": "src/utils.ts",
    "chars": 580,
    "preview": "/**\n * To check match of a part of string\n */\nexport function match(src: string, startAt: number, target: string) {\n  le"
  },
  {
    "path": "src/version.ts",
    "chars": 90,
    "preview": "const { version }: { version: string } = require(\"../package.json\");\n\nexport { version };\n"
  },
  {
    "path": "static/__migrate__.html",
    "chars": 273,
    "preview": "<body>\n<script>\nwindow.addEventListener('message', (e) => {\n  const { key, set, value } = e.data\n  \n  if (set)\n    local"
  },
  {
    "path": "static/_redirects",
    "chars": 281,
    "preview": "/ide2 https://ide.wy-lang.org/ 301\n/ide2.html https://ide.wy-lang.org/ 301\n/ide https://ide.wy-lang.org/ 301\n/ide.html h"
  },
  {
    "path": "static/assets/css/site.css",
    "chars": 2492,
    "preview": "body{\n  font-family: sans-serif;\n  margin:0px;\n  background: rgb(50,50,50);\n}\n\n[contenteditable=\"true\"]:focus {\n  outlin"
  },
  {
    "path": "static/assets/js/site.js",
    "chars": 2249,
    "preview": "\nfunction main() {\n  Highlighter.setTheme(Render.BOOK_COLORS);\n\n  var eds = [];\n  var outs = [];\n\n  function run(i) {\n  "
  },
  {
    "path": "static/index.html",
    "chars": 4154,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">"
  },
  {
    "path": "static/spec.html",
    "chars": 1296,
    "preview": "<style>\n:target {\n   background: linen;\n}\na:link {\n  color:#248;\n  background:transparent;\n  text-decoration: none;\n}\na:"
  },
  {
    "path": "test/__snapshots__/examples.test.ts.snap",
    "chars": 16063,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`examples javascript beer 1`] = `\n\"春日宴。\n與君 九 杯酒。可以窮歡宴。綠酒一杯歌一遍。\n與君 八 "
  },
  {
    "path": "test/examples.test.ts",
    "chars": 1824,
    "preview": "import { compile, evalCompiled } from \"../src/parser\";\nimport { TargetLanguages, CompileOnlyOptions } from \"../src/types"
  },
  {
    "path": "test/fixture/nested-import/四庫全書/序.wy",
    "chars": 44,
    "preview": "吾嘗觀「「本草綱目」」之書。方悟「草部」之義。\n\n今有一元。曰「草部」。名之曰「草部」。"
  },
  {
    "path": "test/fixture/nested-import/四庫全書/本草綱目/序.wy",
    "chars": 42,
    "preview": "吾嘗觀「「草部」」之書。方悟「草部」之義。\n\n今有一元。曰「草部」。名之曰「草部」。"
  },
  {
    "path": "test/fixture/nested-import/四庫全書/本草綱目/草部.wy",
    "chars": 28,
    "preview": "今有一言。曰「「甘草。黄芪。人参。」」。名之曰「草部」。"
  },
  {
    "path": "test/import.test.ts",
    "chars": 346,
    "preview": "import { createTestUtil } from \"./utils\";\n\nconst { expectOutput } = createTestUtil({\n  prefix: \"吾嘗觀「「四庫全書」」之書。\",\n  suffi"
  },
  {
    "path": "test/numbers.test.ts",
    "chars": 4919,
    "preview": "import { num2hanzi, hanzi2num, hanzi2numstr } from \"../src/converts/hanzi2num\";\n\ndescribe(\"number conventions\", () => {\n"
  },
  {
    "path": "test/reader.test.ts",
    "chars": 3106,
    "preview": "import { importReader as reader } from \"../src/reader\";\n\nconst helloworldContent = \"吾有一言。曰「「問天地好在。」」。書之。\";\n\ndescribe(\"re"
  },
  {
    "path": "test/setup.js",
    "chars": 140,
    "preview": "module.exports = async () => {\n  const warn = console.warn;\n  console.warn = () => 0;\n  require(\"set-tz\")(\"UTC\");\n  cons"
  },
  {
    "path": "test/stdlib.calendar.test.ts",
    "chars": 4949,
    "preview": "import { createTestUtil } from \"./utils\";\n\nconst { expectOutput } = createTestUtil({\n  prefix: \"吾嘗觀「「曆法」」之書。\",\n  suffix:"
  },
  {
    "path": "test/stdlib.math.test.cases.ts",
    "chars": 206344,
    "preview": "const MIN_NORMAL_VALUE = Number.MIN_VALUE / Number.EPSILON;\nconst MAX_POW_OF_2 = Number.MAX_VALUE / (2 - Number.EPSILON)"
  },
  {
    "path": "test/stdlib.math.test.ts",
    "chars": 11480,
    "preview": "import { compileLib, assertNumberEqual, assertNearlyEqual } from \"./utils\";\nconst cases = require(\"./stdlib.math.test.ca"
  },
  {
    "path": "test/stdlib.wonton.test.ts",
    "chars": 3728,
    "preview": "import { createTestUtil } from \"./utils\";\n\nconst { expectOutput: 食渾沌 } = createTestUtil({\n  prefix: \"吾嘗觀「「渾沌經」」之書。方悟「食渾沌"
  },
  {
    "path": "test/utils.ts",
    "chars": 5249,
    "preview": "import { execute, compile } from \"../src/parser\";\nimport { CompileOptions } from \"../src/types\";\n\nvar utils = require(\"."
  },
  {
    "path": "tools/examples.js",
    "chars": 1482,
    "preview": "function loadExamples() {\n  const examples = {};\n\n  try {\n    const raw = require.context(\"../examples\", false, /.*\\.wy$"
  },
  {
    "path": "tools/make_calendar.js",
    "chars": 26411,
    "preview": "// This script generates lookup tables for the calendar library.\n// Generated files:\n//   lib/曆表.wy\n//     The LUTs used"
  },
  {
    "path": "tools/make_examples_readme.js",
    "chars": 1957,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { examplesAlias, examplesLinks } = require(\"./examples\");\n"
  },
  {
    "path": "tools/publish.js",
    "chars": 1890,
    "preview": "const execSync = require(\"child_process\").execSync;\nconst packageJSON = require(\"../package.json\");\nconst path = require"
  },
  {
    "path": "tools/test_parser.ts",
    "chars": 1668,
    "preview": "try {\n  process.chdir(\"./tools\");\n} catch (e) {}\n\nvar fs = require(\"fs\");\nvar parser = require(\"../src/parser\");\nvar exe"
  },
  {
    "path": "tools/utils.js",
    "chars": 960,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nvar execSync = require(\"child_process\").execSync;\n\nfunction load"
  },
  {
    "path": "tools/wiki/stdlib_cheatsheet.js",
    "chars": 3585,
    "preview": "const fs = require(\"fs-extra\");\nconst path = require(\"path\");\nconst consola = require(\"consola\");\nconst toc = require(\"m"
  },
  {
    "path": "tools/wiki/update.js",
    "chars": 1070,
    "preview": "const exec = require(\"child_process\").execSync;\nconst fs = require(\"fs-extra\");\nconst path = require(\"path\");\nconst cons"
  },
  {
    "path": "tsconfig.json",
    "chars": 477,
    "preview": "{\n  \"compilerOptions\": {\n    \"outDir\": \"dist\",\n    \"module\": \"commonjs\",\n    \"moduleResolution\": \"node\",\n    \"lib\": [\n  "
  },
  {
    "path": "webpack.base.config.js",
    "chars": 1457,
    "preview": "const path = require('path')\nconst dts = require('dts-bundle');\n\nconst defaultPlugins = () => [\n  new (require('remove-s"
  },
  {
    "path": "webpack.config.js",
    "chars": 910,
    "preview": "const webpack = require('webpack')\nconst { baseConfig, defaultPlugins, DtsBundlePlugin } = require('./webpack.base.confi"
  },
  {
    "path": "webpack.site.config.js",
    "chars": 823,
    "preview": "const webpack = require('webpack')\nconst path = require('path')\nconst { baseConfig } = require('./webpack.base.config')\n"
  }
]

About this extraction

This page contains the full source code of the wenyan-lang/wenyan GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 151 files (1.2 MB), approximately 620.8k tokens, and a symbol index with 197 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!