Skip to content
/ Puncta Public

A punctuation-based esolang, simple and embeddable, written in C

Notifications You must be signed in to change notification settings

CoccusQ/Puncta

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

84 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Puncta

这门语言是一种 esolang

Puncta 一词来自拉丁文中的 punctum,意思是标点

为什么设计这门语言?

因为在现代编程世界中,标点符号往往失去了其本身含义

  • 句号 . 只是小数点成员访问的运算符;
  • 感叹号 ! 竟然变成了表示逻辑否定的符号;
  • 而分号 ; ,甚至只能成为 JS可有可无的分隔符,在大多数脚本语言中销声匿迹。

于是我选取了逗号,句点.感叹号!问号?冒号:分号;,打算让这些标点符号回归它们原本的意思;

同时,我又从中国古文中的 “某某者,某某也” 和日语中句尾的助动词 です (desu) 和 ですか (desuka) 中汲取灵感;

最终设计了一门不读到句末的标点符号,就不知道到底要做什么的语言。

形式如下:

A, B.
L:
A, print!
A, 0? L;

解读:

  1. 赋值语句A, B.

    这是一句陈述句,你可以理解为:“A 者,B 也。” 既然 A 是 B ,那么 B 自然就被赋值给了 A 。

  2. 标签L:

    冒号有引出下文的作用,这里自然用来保存跳转位置,也就是标签。

  3. 命令/动作A, print!

    感叹号表示强调,这相当于你母亲叫你去洗碗一样,我们也用命令的语气,让 A 快去打印(print)。

  4. 条件跳转语句A, 0? L;

    这是疑问句,可以理解为 “A,0,相等乎?” ,如果相等,那么就跳转到标签L。

  5. 跳转语句L;

    为何采用分号?因为分号表示这一小句话结束了,但是整句话还没说完。那么接下来去哪里呢?当然是去冒号 “引出” 的地方了。

    跳转语句既可以跟在条件判断后面表示有条件跳转,也可以单独成句,表示无条件跳转


2025-12-15 更新:加入注释和字符串

  1. 注释(This is a comment)

    括号的本义就是为了解释说明,尤其是在剧本(英文中剧本正是script)中常用来补充角色当时的动作生态,在代码中的作用自然就是注释。

    支持注释块内换行,并且括号支持嵌套。

  2. 字符串"a string"

    这个比较常规,双引号也是少有的保留了 “引用他人话语” 本义的符号。

    支持反斜杠转义符,不支持字符串内直接换行(需要\n转义)。


2025-12-26 更新:加入语法糖

  1. 赋值语法糖A, action! @variable / @value .

    @是一个 “没那么古老” 的符号,其本义是at,也就是在某处,现代常用于邮箱、社交媒体软件中快速 “呼叫” 某人。

    在这里,这个符号是一个赋值语法糖,把诸如:

    A, 0. (Here is the first declaration of A)
    A, B.
    A, print!

    这样的操作,压缩到一行中:

    A, 0. (Here is the first declaration of A)
    A, print! @ B . ( dot `.` at the end of the statement)

    省去了传递值的步骤,在打印字符串的时候极其有用(如果你的字符串只是一个一次性的值):

    s, puts! @ "Hello!" .
  2. 语句块语法糖label#:label#;

    #也是一个 “年轻” 的符号,在本语言中,取其 “标签/话题” 的含义,用作自动生成语句块标签。

    相当于把:

    LEnd;
    L:
    LEnd:

    缩写成:

    L#:
    L#;
    

    这样能够自动生成对于 “语句块” 内代码的保护,使得这段代码顺序执行时不触发,只有跳转进入时才执行。


各位读者不难看出,在这门语言中,句尾标点符号的重要性了:

  • 如果你只读到了 A, B ,那你就不能确定接下来要赋值(.执行动作(!,还是判断条件(?
  • 如果你只读到了 L ,那你就不能确定这是在定义标签(:,还是要准备跳转(;

补充

这门语言在设计时还借鉴了 Minsky Machine,它是一种满足图灵完备的最小计算模型。

附表:语法定义

符号 语气 语义 示例
, 停顿 分隔 A, B.
. 陈述 赋值 A, B.
! 命令 调用动作 A, print!
? 疑问 条件判断 A, 0? L;
: 引出 定义标签 L:
; 转承 跳转 L;
() 解释 注释 (comment)
"" 引用 字符串 "string"
@ 附着 语法糖 A, B! @C.
# 标签 语法糖 L#: L#;