#编程语言 #语言 #lisp #null #meme #backward #umpl-lang

bin+lib umpl

Umpl 是一种混合了 C 类语言和 Lisp 类语言的梗语言。

6 个版本 (稳定版)

1.1.1 2023 年 2 月 17 日
1.1.0 2023 年 1 月 11 日
1.0.2 2022 年 8 月 9 日
1.0.0 2022 年 8 月 5 日
0.9.9 2022 年 8 月 5 日

编程语言 中排名 162

Download history 85/week @ 2024-03-09 88/week @ 2024-03-16 5/week @ 2024-03-23 11/week @ 2024-03-30 2/week @ 2024-04-06 82/week @ 2024-04-13 2/week @ 2024-04-20 1/week @ 2024-05-25

每月下载量 128
2 个 crate 中使用(通过 git_function_history

MIT 许可证

180KB
3.5K SLoC

cargo clippy crates.io Crates.io msrv license

UMPL

关于

UMPL 是一种高度冗长的、类似 C 和 Lisp 的语言。

我们努力打破向后兼容性,所以如果你尝试为不同版本的该语言编写相同的代码,这将是一项有趣的挑战,如果这个项目能够持久下去的话。

在 UMPL 中,为了解决 null 问题,我们发明了一种新的类型称为 hempty,它与 null 相同,但听起来更好,并且它增加了所有编程语言中 null 类型的长列表。

所有错误报告都直接发送到 /dev/hempty

安装/构建

构建

  • 安装 rust 和 cargo
  • 克隆仓库
  • 运行 cargo build --release

安装

  • cargo
    • 安装 rust 和 cargo
    • 运行 cargo install umpl
  • 版本
    • 这里 下载您平台上的最新版本

命名约定

UMPL 中的变量必须遵循 kebab-case 命名约定,并且不允许有大写字母。

所有内部关键字的大小写取决于编译器选项。

示例

要查看 UMPL 的示例代码,您可以查看 此目录,并查看正式语言语法请参阅 此文件

IDE 支持

存在一个半工作的 VSCode 扩展程序,您可以在 这里 找到。

编译器选项

umpl File Options]

选项

  • -r, i:启动REPL
  • -h:打印帮助信息
  • -t=<number>:设置关键字切换大小写
  • -f:开启强制模式,在通过REPL编写程序时很有用
  • -e:开启evil模式

以及代码中隐藏的其他黑暗秘密。

语言文档

目录

类型

数字

数字是一个十六进制浮点数,显示给用户时将以十进制形式显示。有效示例:0xa0x14343.a11010.1

字符串

字符串是一系列字符。字符串以`开始和结束。

字符串转义序列

转义序列 描述
\n 换行符
\t 制表符
\r 回车符
\b 退格键
\f 换页符
\a 警报
\v 垂直制表符
\e 转义
\\ 反斜杠
\` 单引号
\x{十六进制} ASCII表示中的十六进制值
\u{十六进制} Unicode字符

布尔值

布尔值要么是true,要么是false。

hempty

Hempty与null相同,但听起来更好。

文件

文件是文件的路径。

声明

名称 描述 用法 特殊关键字 特殊变量 示例
创建 创建一个变量 使用文字或表达式创建var-name N/A N/A 创建数字-带有var5
创建str-带有var((输入`>> `))>
使用var创建str-var
list 创建一个列表 使用var-name创建列表[literal or expression literal or expression] N/A N/A 列表数字-带有list[1 3]
liststr-带有list[8, ((输入`>> `))]
potato 声明一个函数 使用potato emoji-name num-of-arguments ⧼code⧽ 返回 literal-or-expression 对于每个参数,你都会得到$argument-number,即第一个参数为$1等。 potato 😀2返回 ((加法$1 $2))>

控制流

名称 描述 用法 特殊关键字 示例
if语句 如果布尔值为true,则执行if代码,否则执行else代码 if {boolean: literal or expression} ⧼if code⧽ else ⧼else code⧽ N/A if {true}(`true`)>else(`false`)>
if {not((true))>}(`true`)>else(`false`)>
if {布尔值-var}if {true}(`true`)>else(`false`)>⧽ ⧽else(`false`)>
循环语句 循环直到代码遇到break或continue loop ⧼code⧽ break, continue loopif {true}(`true`)> breakelse(`false`)> continue⧽⧽

关键字

要调用关键字,首先需要创建一个表达式,所以()>或()>>或()<,在表达式中放入另一对括号,然后是关键字及其参数

名称 描述 参数 返回值 示例
加法 如果第一个参数是数字,则返回所有参数的和,如果它是字符串,则将所有后续参数连接到该字符串,其他任何东西都不会工作 any*1: 参数 any ((加法5 6 7))>
((加`s`true 7))>
减法 将第一个参数设置为原始值,然后从它中减去每个后续的参数,除非有一个参数,在这种情况下,它会被取反,返回它的负值。 number*1: 参数 数字 ((减法5 6 7))>
((减法1))>
乘法 如果第一个参数是字符串,则将其与下一个参数相乘;如果是数字,则将第一个参数设置为原始值,然后每个后续参数都乘以它,任何其他类型的数据都不起作用。 any*1: 参数 any ((乘法5 6 7))>
((乘法 `s`7))>
除法 将第一个参数设置为原始值,然后每个后续参数都除以前一个除数。 number*1: 参数 数字 ((除法5 6 7 3))>
((除法1))>
not 如果值是假的,则返回true,否则返回false。 [布尔值:值] 布尔值 ((nottrue))>
((非布尔值-var))>
比较value1和value2,如果任一为true,则返回true。 [布尔值:value1, 布尔值:value2] 布尔值 ((true false))>
((或布尔值-var布尔值-var-1))>
比较value1和value2,如果两个都为true,则返回true。 [布尔值:value1, 布尔值:value2] 布尔值 ((true false))>
((与布尔值-var布尔值-var-1))>
eq 比较两个值是否相等 [任何类型:value1, 任何类型:value2] 布尔值 ((eqtrue false))>
((eq `t` string-var))> ((eq 5 6))>
ne 比较两个值如果不相等 [任何类型:value1, 任何类型:value2] 布尔值 ((netrue false))>
((ne `t` string-var))>
gt 检查number1是否大于number2 [数字:number1, 数字:number2] 布尔值 ((gt5 6))>
lt 检查number1是否小于number2 [数字:number1, 数字:number2] 布尔值 ((lt5 6))>
le 检查number1是否小于或等于number2 [数字:number1, 数字:number2] 布尔值 ((le5 6))>
ge 检查number1是否大于或等于number2 [数字:number1, 数字:number2] 布尔值 ((ge5 6))>
addwith 在原地对变量添加值,如果变量是字符串,则任何内容都可以添加到它上面,但如果它是数字,则只能添加数字,不能添加其他内容。 [变量:变量, 任何类型:值] any ((addwith num-var5))>
((addwithstr-var `s`))>
((addwithstr-var5))>
subtractwith 从原地对变量减去值 [变量:变量, 数字:值] 数字 ((subtractwith num-var5))>
dividewith 在原地对变量除以值 [变量:变量, 数字:值] 数字 ((dividewith num-var5))>
multiplywith 在原地对变量乘以值,如果变量是字符串,则变量变为字符串值乘以的结果,如果变量是数字,我们则将变量乘以该值,任何其他类型的变量都不起作用。 [变量:变量, 数字:值] any ((multiplywith num-var5))>
((multiplywithstr-var5))>
input 带消息的input [字符串:消息] 字符串 ((input"输入你的名字"))>
((input string-var))>
setwith 将变量设置为值 [变量:变量, 任何类型:值*] any ((setwith num-var5))>
((setwithstr-var `s`))>
exit 退出并提供数字 [数字:数字] hempty ((exit5))>
error 提供错误消息的错误 [字符串:消息] hempty ((error"error"))>
((error string-var))>
strtonum 将字符串转换为数字 [字符串:字符串] 数字 ((strtonum `5`))>
((strtonum `0x5`))>
strtobool 将字符串转换为布尔值 [字符串:字符串] 布尔值 ((strtobool `true`))>
((strtobool `false`))>
strtohempty 将字符串转换为hempty [字符串:字符串] hempty ((strtohempty `empty`))>
runcommand 运行操作系统命令 [字符串:命令] 字符串 ((runcommand"ls"))>
open 打开文件 [字符串:文件] 文件 ((open"file.txt"))>
close 关闭文件 [文件:文件] hempty ((close file-var))>
write 以模式将消息写入文件 [文件:文件, 字符串:消息, 字符串:模式] hempty ((write file-var"message" "w"))>
((write file-var"message" "a"))>
writeline 以模式和行号将消息写入文件 [文件:文件, 字符串:消息, 数字:行, 字符串:模式] hempty ((writeline file-var"message" 1 "w"))>
((writeline file-var"message" 1 "a"))>
read 从文件中读取 [文件:文件] 字符串 ((read file-var))>
readline 读取文件中指定的行 [文件: 文件名, 行号: 行号] 字符串 ((readline 文件-var1))>
删除 删除变量 [变量: 变量名] hempty ((delete num-var))>
((删除str-var))>
deletefile 删除文件 [文件:文件] hempty ((deletefile 文件-var))>
createfile 创建新文件 [字符串:文件] 文件 ((createfile"file.txt"))>
new 运行自定义函数 函数: 名称, 参数 函数返回的任何内容 ((new 😀3 5))>
type 返回值的类型 [任何: 值] 字符串 ((type 1))>

*:有时可以将变量设置为两个值以制作列表中的列表

*1:一个或多个参数

贡献

如果您对该语言有任何想法,请将其放入此文件中,并附带一个或两个示例,说明如何在语言中使用它。

依赖项

~2–8.5MB
~57K SLoC