#esolang #interpreter #poetry #esopo

ashpaper

William Hicks 构思的 Esopo 语言 Rust 解释器 AshPaper

8 个版本

使用旧的 Rust 2015

0.3.0 2019年10月23日
0.2.5 2019年10月22日
0.1.4 2019年10月19日

编程语言 中排名第 403


用于 ashpaper-bin

MIT 许可证

23KB
548

Build Status Coverage Status Crates.io Version Crates.io

AshPaper

AshPaper 是由 William Hicks 构思的 Esopo 语言的解释器。您可以在 William Hicks 的个人网站上了解它和 Esopo 项目 这里。Daniel Temkin 也在 esoteric.codes 上对此进行了介绍,您可以在这里阅读 这里。当然,还有规范!您可以在这里查看 这里

工作原理

诗歌是你的程序。

你有两个寄存器可供使用,r0 和 r1,用于存储有符号整数(类型为 i64)。你还有一个堆栈,可以存储有符号整数(边界仅限于 Vec<i64>)。

以下是你可以使用的指令(按照优先级顺序排列)

  • 与上一行押韵:未实现。
  • 行包含 /:如果活动寄存器中的值大于该行的音节数,则转到与活动寄存器中 非活动 寄存器值对应的行号。如果 abs(n) <= lines,则 n,否则 n % lines。
  • 单词中包含大写字母:取活动寄存器的相反数。
  • 单词开头有大写字母:将寄存器相乘并将结果存储在活动寄存器中。
  • 行包含单词 'like' 或 'as':将寄存器相加并将结果存储在活动寄存器中。
  • 行包含 ?:打印与活动寄存器值关联的 ASCII 字符。如果 abs(n) <= u8::MAX n,否则 n % u8::MAX。
  • 行包含 .:打印活动寄存器的整数值。
  • 行包含 ,:从堆栈中弹出并存储在活动寄存器中。
  • 行包含 -:将活动寄存器的值推送到堆栈中。
  • 连续单词的变化:未实现。
  • 空白行:无操作。
  • 其他所有内容:将行的音节数存储到活动寄存器中。

让我们以名为 lovely-poem.eso 的文件中的这首诗为例。这首诗程序(诗程?)计算阶乘以及标题中的音节数。(我从阅读威廉·希克斯的《其他木工》这首诗中学到了很多东西)

lovely poem

  it is a calculator, like a
      poem, is a poem, and finds
        factori-
          als
  The input is the syllAbles
in the title, count them, as one counts
  (q) what other poem, programs can be writ
  (a) anything a Turing
    machine-machine-machine
    would do
re/cur
    sion works too, in poems, programs, and this
       a lovely.
poem or a calculator or nothing
how lovely can it be?

使用这个库,你可以用如下类似的程序来运行它

extern crate ashpaper;

use std::fs;

pub fn main() {
    let fname = "lovely-poem.eso";
    let contents = fs::read_to_string(fname).expect("Something went wrong reading input file!");
    match ashpaper::program::execute(&contents) {
        Ok(res) => print!("{}", res),
        Err(e) => eprintln!("{}", e),
    }
}

它将产生以下字符串

24

RUST_LOG=info 被设置,并且调用者初始化日志记录时,你可以获取程序评估信息。以下是 lovely-poem.eso 的样子。

instruction                                         |  r0  |  r1  |  stack
--------------------------------------------------- | ---- | ---- | -------
lovely poem                                         |  4   |  0   | []
                                                    |  4   |  0   | []
  it is a calculator, like a                        |  4   |  4   | []
      poem, is a poem, and finds                    |  4   |  4   | []
        factori-                                    |  4   |  4   | [4]
          als                                       |  4   |  1   | [4]
  The input is the syllAbles                        |  4   |  -1  | [4]
in the title, count them, as one counts             |  3   |  -1  | [4]
  (q) what other poem, programs can be writ         |  3   |  4   | []
  (a) anything a Turing                             |  3   |  12  | []
    machine-machine-machine                         |  3   |  12  | [12]
    would do                                        |  3   |  2   | [12]
  it is a calculator, like a                        |  3   |  5   | [12]
      poem, is a poem, and finds                    |  3   |  12  | []
        factori-                                    |  3   |  12  | [12]
          als                                       |  3   |  1   | [12]
  The input is the syllAbles                        |  3   |  -1  | [12]
in the title, count them, as one counts             |  2   |  -1  | [12]
  (q) what other poem, programs can be writ         |  2   |  12  | []
  (a) anything a Turing                             |  2   |  24  | []
    machine-machine-machine                         |  2   |  24  | [24]
    would do                                        |  2   |  2   | [24]
re/cur                                              |  2   |  2   | [24]
    sion works too, in poems, programs, and this    |  2   |  24  | []
       a lovely.                                    |  2   |  24  | []
poem or a calculator or nothing                     |  10  |  24  | []
how lovely can it be?                               |  10  |  24  | []

关于与非正式规范的兼容性的一些注意事项

  • 目前,我的实现可能无意中偏离了规范。如果你发现了类似的问题,请提出问题 ❤️ ❤️
  • 全韵和押韵规则尚未实现。

依赖项

~2.2–3MB
~60K SLoC