#repl #language #toy #value #data #hacky #pyhon

app xur

Toy langage made to be used in a REPL

1 unstable release

0.1.0 Dec 30, 2021

#1 in #hacky

MIT license

30KB
732 lines

Xur

Experimental language designed to be used in a repl for very quick and hacky data manipulation.

Inspired by pyhon and ruby with a little bt of haskell mixed in.

Everything in Xur is a function, and all functions can be made partial.

For example, these are all equivilent:

to_int("FF", 16)
"FF" to_int 16
to_int(,16)("FF")
"FF".to_int(16)
(,16).to_int("FF") #WIP

The parenthesies (..) is called a parameter set. Paraeter sets expand to fill a functions arguments with its contents. So a functon can be defined with many parameters, but only called with a max of 2. A parameer set will fill in the rest of the parameters.

A function will only take 1 or 2 arguments. If a parameter set is directly after a function, that will be its only parameter.

to_int("FF", 16)

If there is no parameter set, it will take the value before it as its first argument, and the value after as its second argument.

"FF" to_int 16

There are a few special characters that can only be used as complete function names (such as ., +, -, @ etc.).

For example . is the full name of a function and it can never be used inside an identifier name. Because of this, there dosent need to be any whitespace when using it as in inline function, like is needed with to_int in example 2.

The . funtction is just a normal function that converts a.b into b(a).

Like haskell, pasing in only some of the arguments to a function is perfectly fine. Instead of receving the return value of the function, you will recieve a partial function.

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

So, for example, mapping to_int to a list of integers would not need a new function or a closure

["AA", "BB", "CC"].map(to_int(,16))

Ideas / plans


Functions

Like the idea behind '.', i would like everything that can possably be a funciton, to be a function. Including the function definition.

fn(to_int, (s, base), {
    ...
})

fn would be a function that takes in an 'identifer' 'param set' and a 'block' and would wrap the block in a lambda that did something like this python-esque pseudo-code

def fn(id, params, block):
    f = create_function(block, enviroment={
        s:    params.pop()
        base: params.pop()
    })
    set(id, f)

Type associated functions

Add -> function wich would act similarly to . except it would do some light name mangling. For example, these woukd be exaclty equivilent

"FF"->to_int(16)
__number__to_int("FF", 16)

and these defitions would be exactly equivilent

fn(__number__to_int, (s, base), {
    ...
})

zn(number, {
    fn(t_int, (s, base), {
       ...
    })
})

Dependencies

~2.5–10MB
~54K SLoC