1个不稳定版本
0.1.0 | 2021年12月30日 |
---|
#2 in #hacky
30KB
732 行
Xur
专为在REPL中进行快速、灵活的数据操作而设计的实验性语言。
受Python和Ruby启发,并融入了一些Haskell的特点。
Xur
中的所有内容都是函数,且所有函数都可以是部分函数。
例如,以下都是等价的
to_int("FF", 16)
"FF" to_int 16
to_int(,16)("FF")
"FF".to_int(16)
(,16).to_int("FF") #WIP
括号 (..)
被称为参数集。参数集会扩展以填充函数的参数。因此,一个函数可以定义许多参数,但最多只能调用2个。参数集将填充其余的参数。
函数只接受1或2个参数。如果参数集直接跟在函数后面,那么它将是其唯一的参数。
to_int("FF", 16)
如果没有参数集,它将取其前面的值作为第一个参数,后面的值作为第二个参数。
"FF" to_int 16
有一些特殊字符只能用作完整的函数名(例如 .
、+
、-
、@
等)。
例如 .
是一个函数的完整名称,它永远不会在标识符名称中使用。因此,在用作内联函数时不需要任何空格,就像示例2中的 to_int
一样。
.
函数只是一个普通函数,它将 a.b
转换为 b(a)
。
就像Haskell一样,只传递函数的一部分参数是完全可以的。你不会接收到函数的返回值,而是接收到一个部分函数。
to_int # returns fn(num:str, base:num) -> num
to_int("FF") # returns fn(base:num) -> num
to_int(,16) # returns fn(num:str) -> num
例如,将 to_int
映射到整数列表不需要新的函数或闭包
["AA", "BB", "CC"].map(to_int(,16))
想法/计划
函数
像 '.
' 的想法一样,我希望所有可能成为函数的东西都能成为函数,包括函数定义。
fn(to_int, (s, base), {
...
})
fn
将是一个接受 '标识符'、'参数集' 和 '块' 的函数,并将该块包装在一个类似 Python 风格的伪代码中的 lambda 中执行某些操作
def fn(id, params, block):
f = create_function(block, enviroment={
s: params.pop()
base: params.pop()
})
set(id, f)
类型相关函数
添加 ->
函数,其行为类似于 .
,但会进行一些轻量级的名称改写。例如,以下两者将完全等价
"FF"->to_int(16)
__number__to_int("FF", 16)
并且以下定义也将完全等价
fn(__number__to_int, (s, base), {
...
})
zn(number, {
fn(t_int, (s, base), {
...
})
})
依赖关系
~2.5–8MB
~53K SLoC