10个版本 (6个重大更新)

0.9.0 2023年8月11日
0.8.0 2022年7月12日
0.6.0 2022年6月16日
0.5.2 2022年6月12日
0.2.1 2019年5月9日

#1816过程宏

每月34次下载

MIT 许可证

90KB
2.5K SLoC

Join the chat at https://gitter.im/makoConstruct/termpose

Termpose - 一种敏感的标记语言

Termpose是一种非常灵活的标记语言,具有优雅的空白语法。

一旦解析,Termpose数据非常易于处理。它没有映射和数字。它只有列表和字符串。API提供类型检查和转换为映射和数字等类型,但格式本身并不强加。Termpose赋予特殊意义的是以下字符:":()\ 。其余的字符您可以随意使用。

以下是一个存储在termpose中的数据示例。这与我正在开发的游戏的保存格式的一部分非常相似

mon
  name leafward
  affinity creation
  description "
    Plants healing bombs.
    Standard attack.
    Watch out, it's fragile!
  stride 2
  stamina 3
  recovery 2
  health 50
  abilities
    move
    strike drain:2 damage:standard:2
    bomb drain:3 effect:heal:standard:2 grenadeTimer:2 grenadeHealth:20 range:2 radius:2

在s表达式语言(在这种情况下,woodslist)中,它将分解为以下结构

(mon
  (name leafward)
  (affinity creation)
  (description
"Plants healing bombs.
Standard attack.
Watch out, it's fragile!")
  (stride 2)
  (stamina 3)
  (recovery 2)
  (health 50)
  (abilities
    move
    (strike (drain 2) (damage (standard 2)))
    (bomb (drain 3) (effect (heal (standard 2))) (grenadeTimer 2) (grenadeHealth 20) (range 2) (radius 2))
  )
)

我们总是能够使用一个很好、最小、灵活的S-Expressions语言,而不是XML、Json、TOML、Yaml或其他任何东西,但是那些旧语法中有些东西让人难以接受。Termpose消除了这些。

平台支持?

警告:目前,Rust是唯一符合termpose规范的编程语言,其他语言在具有缩进的行项上做了一些不同的处理,因为在我撰写规范之前,我没有深入思考过哪里最合理。

语言 规范兼容 状态 更多信息
C++ 非常好。 基本API解析器组合器简介termpose.cpp
Haxe 相当不错。 Haxe源代码
Scala 非常好 本简要介绍源代码(从底部开始)
JavaScript 有一个基本的API可以将termpose转换为字符串数组。 Haxe源代码
C# 给我一个API设计,我会实现的 Haxe源代码
Java 如果你想制作一个优秀的API,请与我联系,这会很容易 Haxe源代码
Python 如果你想制作一个优秀的API,请与我联系,这会很容易 Haxe源代码
C 低级char* → Term* API已实现,且没有泄漏 C头文件
Rust 是的 对termpose和woodslist有良好的支持。有自动推导功能。 Rust简介

详细格式

在这里,我将描述如何在termpose中编写数据和结构。

在基于s-expression的语言中,列表中的第一个术语通常被认为是特殊的。例如,

(f a b c)

在这里,这通常是对函数 f 的应用,在变量 abc 上调用。

在termpose中,这种结构也可以以一种更熟悉大多数程序员和数学家的方式表达,键入更短,也许更明确

f(a b c)

任何可以用这种方式表达的东西也可以写成

f
  a
  b
  c

在编程语言和数据中,我们通常希望有一种简单的方式来表达成对的东西。例如,在swift中,你可能会用以下方式定义或创建一个矩形

CGRect(x: 0, y: 0, width: 320, height: 500)

在termpose的环境中,这种结构可以用相同的方式表达,只是没有逗号。我们不需要或想要这里的逗号。

CGRect(x: 0  y: 0  width: 320  height: 500)

或者更简洁地

CGRect x:0 y:0 width:320 height:500

或者

CGRect
  x:0
  y:0
  width:320
  height:500

我应该说我,冒号不是特殊的语法,它们也会分解为列表

(CGRect (x 0) (y 0) (width 320) (height 500))

你可以说它们成对出现。你也可以说冒号将第一项作为第二项的函数。这两种解释都是有效的。

print:"maybe"

如果你想调用一系列链式单参数调用,你可以。

print:to_lowercase:reverse:"EBYAM"

将转换为

print(to_lowercase(reverse(EBYAM)))

你可能注意到在“EBYAM”周围的引号在翻译中被省略了。引号用于在原子中包含空白。如果你在原子字符串中不使用任何空白,则不需要它们。以下是一些更典型的引号语法示例

print "a string"
print "another string"
print "and then another"

但是,如果我们假设的基于termpose的编程语言想要打印非常长且多行的内容呢?

print "
  a string
  another string
print "and then another"

我们可以在我们想要它开始缩进之前简单地打开一个字符串,并在我们想要它结束时取消缩进。

如果我们真的在创建一个基于termpose的编程语言,我们可能希望向引号原子添加一些额外的东西来表示我们打算将它们作为字符串字面量读取。termpose通过使引号字符串由它们直接相邻的任何内容调用,试图使其变得简单。例如,如果我们使用一个 '

print '"
  a string
  another string
print '"and then another"

将分解为

((print ("'" "a string\nanother string")) (print ("'" "and then another")))

这将使通过查找以 ' 开头的术语来检测字面量变得非常容易。

我希望我已经能够说服你termpose足够灵活,可以表达你想要表达的所有数据。要了解使用termpose有多容易,请查看上面列出的API简介。

依赖关系

~2MB
~46K SLoC