跳到主要内容

项目 | 典语言(dian-lang)设计

提示

别问,问就是你急了。

设计思路

随着互联网的发展,人们使用的语言在不断进化,用语趋于精简,「典」「孝」「急」三字成为网络新型中文的代表。

顺应语言发展的潮流,典语言设计为一门精简的纯函数式编程语言。只需寥寥几个关键字,配合柯里化、惰性求值等高级特性,就能实现丰富而强大的功能。

关键字

关键字含义
定义全局函数。
太典了结束函数定义。
开始「单子语句块」。
急了「单子语句块」的匿名函数组合语法糖。
差不多得了结束「单子语句块」。
典中典之定义匿名函数。
遇到定义函数参数。
忽略表达式。
看看表达式反向折叠。
鉴定一下开始模式匹配。
鉴定为定义模式匹配规则。
一眼结束模式匹配。
开始了开始了定义主函数。

表达式语法

典语言使用特殊而有力的表达式树构建方式。

在典语言中,多个值用逗号分隔,即构成一条表达式。表达式从左向右折叠,构成表达式树。折叠的规则为:

  • 一般情况下,左侧的表达式树作为函数,右侧的单个值作为参数,输入函数中,构成新的表达式树。
  • 如果右侧的值前有「看看」,那么反过来将右侧的值作为函数,左侧的表达式树作为值输入函数。
  • 如果表达式跟在参数定义「遇到 XX」后,此参数将隐式地作为表达式树的第一个值。同样,模式匹配「鉴定为 XX」后,进行匹配的值将作为表达式树的开始。
  • 当「乐」出现在表达式中时,左侧的表达式树将会被忽略,替换为单位函数。

例如,要表示 114 + 514,在典语言中,应该写作:114,看看加法,514。其中,「加法」是一个内置的二元函数,表示两个数的和。

示例

/* 快速排序 */

典,快速排序,遇到列表,鉴定一下:
鉴定为【】;
鉴定为【头;尾】,乐,筛查,尾,典中典之「大于,头」,看看加法,【头】,看看加法,
典中典之「筛查,尾,典中典之「小于,头」」;
一眼,太典了。

开始了开始了,急:
【11,45,14,19,19,810】,急了列表;
快速排序,列表,急了结果;
结果,看看嬴麻了,急了;
差不多得了,太典了。

/* 输出:[11, 14, 19, 19, 45, 810] */

完整 pest 语法

Program = { SOI ~ (Block)* ~ EOI }
Block = { Def | Main }

Def = { "典" ~ Sep ~ Ident ~ (Sep ~ Parameters)? ~ Sep ~ Expr ~ Sep ~ "太典了" ~ Sep }
Main = { "开始了开始了" ~ Sep ~ Expr ~ Sep ~ "太典了" ~ Sep }

Parameters = { Parameter ~ (Sep ~ Parameter)* }
Parameter = { "遇到" ~ Ident }

Expr = { Value ~ (Sep ~ Value)* }
Value = { Ident | Number | String | List | Match | Lambda | RevValue | Discard | MonadicBlock }
RevValue = { "看看" ~ Ident | "看看" ~ Lambda }
Discard = { "乐" }

List = {
LeftBracket ~ RightBracket |
LeftBracket ~ Value ~ (Comma ~ Value)* ~ Tail? ~ RightBracket
}
Tail = { Semicolon ~ Value }

Match = { "鉴定一下" ~ Sep ~ Rules ~ Sep ~ "一眼" }
Rules = { Rule ~ (Sep ~ Rule)* }
Rule = { "鉴定为" ~ Pattern ~ (Sep ~ Expr)? }

Pattern = { Ident | ListPattern }
ListPattern = {
LeftBracket ~ RightBracket |
LeftBracket ~ Pattern ~ (Comma ~ Pattern)* ~ TailPattern? ~ RightBracket
}
TailPattern = { Semicolon ~ Ident }

Lambda = { "典中典之" ~ Parameters? ~ LeftParenthesis ~ Expr ~ RightParenthesis }

MonadicBlock = { "急" ~ Sep ~ MonadicExpr ~ (Sep ~ MonadicExpr)* ~ Sep ~ "差不多得了" }
MonadicExpr = { Expr ~ Sep ~ "急了"~ Ident? }

Number = ${ Integer | Float }
Integer = @{ "-"? ~ (
ASCII_DIGIT+ |
"0x" ~ ASCII_HEX_DIGIT+ |
"0b" ~ ASCII_BIN_DIGIT+ |
"0o" ~ ASCII_OCT_DIGIT+
) ~ "W"? }
Float = @{ "-" ~ (
ASCII_DIGIT* ~ "." ~ ASCII_DIGIT+ |
ASCII_DIGIT+ ~ "."
) ~ (("e" | "E") ~ ("+" | "-")? ~ ASCII_DIGIT+)? ~ "W"? }

String = ${ "“" ~ StringInner1 ~ "”" | "‘" ~ StringInner2 ~ "’" | "《" ~ StringInnerRaw ~ "》" }
StringInner1 = @{ Char1* }
Char1 = {
!("”" | "\\") ~ ANY
| "\\" ~ ("”" | "\\" | "/" | "n" | "r" | "t")
| "\\" ~ ("x" ~ ASCII_HEX_DIGIT{2})
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
StringInner2 = @{ Char2* }
Char2 = {
!("’" | "\\") ~ ANY
| "\\" ~ ("’" | "\\" | "/" | "n" | "r" | "t")
| "\\" ~ ("x" ~ ASCII_HEX_DIGIT{2})
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
StringInnerRaw = @{ CharRaw* }
CharRaw = { !"》" ~ ANY }

Ident = @{ !Keyword ~ Letter+ }
Letter = { LETTER | "_" }

Keyword = {
"典" | "太典了" | "急" | "急了" | "差不多得了" | "典中典之" | "遇到" | "乐" | "看看" | "鉴定一下" |
"鉴定为" | "一眼" | "开始了开始了"
}

Sep = _{ Comma | Period | Semicolon | Colon }

Comma = _{ "," | "," }
Period = _{ "。" | "." }
Semicolon = _{ ";" | ";" }
Colon = _{ ":" | ":" }
LeftParenthesis = _{ "(" | "(" | "「" }
RightParenthesis = _{ ")" | ")" | "」" }
LeftBracket = _{ "【" | "[" }
RightBracket = _{ "】" | "]" }
Quotation = _{ "“" | "”" | "‘" | "’" | "《" | "》" | "\"" | "'" }

WHITESPACE = _{ " " | "\t" | NEWLINE }
COMMENT = _{ "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
Loading...