项目 | 典语言(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...