Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tatut/elf-lang
Elf programming language
https://github.com/tatut/elf-lang
Last synced: about 11 hours ago
JSON representation
Elf programming language
- Host: GitHub
- URL: https://github.com/tatut/elf-lang
- Owner: tatut
- License: mit
- Created: 2024-10-28T18:36:27.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2024-12-30T10:20:07.000Z (10 days ago)
- Last Synced: 2024-12-30T11:25:19.291Z (10 days ago)
- Language: Prolog
- Homepage:
- Size: 1.68 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Elf programming language
![test workflow](https://github.com/tatut/elf-lang/actions/workflows/test.yml/badge.svg)
![elf-lang logo](https://github.com/tatut/elf-lang/blob/main/elf-lang-logo-small.png?raw=true)
This is the Elf programming language.
Designed to get help those elves get their xmas duties done
without tripping into lava.Try the playground at: https://tatut.github.io/elf-lang/
## Syntax and evaluation
Syntax is a little bit Smalltalkish, with Perlish implicit values and Clojurish
functional programming with records & methods.... all implemented lovingly in Prolog.Like Smalltalk all method calls are evaluated first left to right, then all binary operators left to right.
There is no operator precedence, use parenthesis to group math expressions.```
# wrong appends 5 (length of string "World") to "Hello "
"Hello " ++ "World" len# right, calculates length of "Hello World" (11)
("Hello " ++ "World") len
```**Why?**
Why not.
### Syntax
**Syntax overview**
Comments start with `#` and end in newline.
```
"I'm an Elf" # a string obviously (actually a list of ascii code ints)
`(c|h)at` # a compiled regular expression@? # the ´?´ character (as ascii integer 62)
420.69 # a decimal number
666 # an integer
[4, 6, 9] # list of integers
true # the true value
false # the false value
nil # the nothing value$ # reference to the 1st argument in function
$1 ... $9 # reference to the Nth argument in function
my # reference current object in methods
&foo # reference to method named foo_ # reference to the value of the last statement
{ $ * 2 } # function of arity 1
{a,b| a + b} # function of arity 2 with named arguments
["hello", "there"] # list
Elf{name,age} # object record definition
Elf.greet: { "Hello %s, my name is %s." fmt(my name, $) } # define method on recordelf greet("world") # call method
Elf{name: "Jolly Twinkletoes", age: 1607} # an object
Elf new("Scrappy Fairytoes", 666) # programmatic construction
%{"foo": 42} # associative key/value map
the_answer: 42 # assignment statement
"naughty_list.txt" lines # call method lines on string
# if is just a method taking 1 or 2 args (then,else)
# if the value is a function it is called with the value
# otherwise it is returned
somebool if(thenblock)
somebool ife(thenblock, elseblock)```
### Valid names
Names of any methods or assignments must begin with `_` or a letter (case doesn't matter),
after that it may contain alphanumeric and `-`, `_` and `?` characters.For example these are valid names:
- `my_variable`
- `is-valid?`
- `Foo1`Reserved words (`and`, `or` and `_`) cannot be used as names.
### Binary operations
Elf supports the following binary operators:
- `+`,`-`,`*`,`/`,`%` numeric addition, substraction, multiplication, division and modulo (number)
- `<`, `<=`, `>`, `>=` numeric less than, less than or equals, greater than and greater than or equals (true/false)
- `=` value equality (true/false)
- `++` list append (yields list that is the appended left and right hand side lists)
- `and` boolean truth (true if both left and right hand sides are truthy, false otherwise)
- `or` boolean or (true if either left or right hand side is truthy, false otherwise)### Records
Elf supports records which have a predefined list of fields.
Records can be instantiated by `RecordName{field1Name: field1Val, ...}` any fields not given a value will have the initial value `nil`.Record fields are automatically added as method to get/set the value.
The 0-arity method gets the value and 1-arity sets it.Records also support user defined methods that are functions with the
special name `my` referring to the record instance.There is a special method called `dynamic` that will be invoked for any
methods not defined. This can be used for meta-programming.
The method gets the name of the undefined method as string and a list
of its arguments.### Regular expressions
Elf supports regular expressions that are read by using backticks.
A regular expression is callable like a function and returns a list of
strings (first one being the full match and then any capture groups)
or `nil` if the input does not match the regex.