#repl #language #toy #value #data #hacky #python

app xur

用于REPL的玩具语言

1个不稳定版本

0.1.0 2021年12月30日

#2 in #hacky

MIT 许可证

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