It is a programming language. Stack-based. Semi-functional. Backwards. Inspired by Python and Forth. I'm talking about Déjà Vu.
$ cd vm/
$ make
$ cd ..
Assuming you have a module called yourfile.deja
, you can compile and
run it with:
$ vm/vu yourfile.deja
!print "Hello world!"
fib a:
if > 1 a:
fib - 1 a
fib - 2 a
+
elseif = a 1:
1
else:
0
"!print !. dup"
!print !. dup
. * 1/3 3/2 # prints 1/2
If you know what BNF is, here's the one for Déjà Vu:
Program ::= <Block>*
Block ::= <Head> ":" <NewLine>+ (<Indentation> <Block>)+
| <Line> <NewLine>+
| <IfBlock>
| <TryBlock>
IfBlock ::= "if" <Space> <Line> ":" <NewLine>+ (<Indentation> <Block>)+
("elseif" <Space> <Line> <Space>? ":" <NewLine>+ (<Indentation> <Block>)+)*
("else" <Space>? ":" <NewLine>+ (<Indentation> <Block>)+)?
TryBlock ::= "try" <Space>? ":" <NewLine>+ (<Indentation> <Block>)+
("catch" (<Space> <ProperWord>)+ <Space>? ":" <NewLine>+ (<Indentation> <Block>)+)*
Head ::= "while" <Space> <Line>
| "for" <Space> <ProperWord> (<Space> <Line>)? <Space>?
| "repeat" <Space> <Line>
| "func" <Space> <ProperWord> <Arguments>
| "local" <Space> <ProperWord> <Arguments>
| "labda" <Arguments>
| <ProperWord> <Arguments>
Indentation ::= (" " | <Tab>)*
Line ::= (<Word> (<Space> <Word>)*)? <Space>?
Arguments ::= (<Space> <ProperWord>)* <Space>?
Space ::= (" " | <Tab>)+
Word ::= ProperWord
| Get
| Identity
| String
| Number
| Fraction
Get ::= "@" <ProperWord>?
Identity ::= ":" <ProperWord>?
ProperWord ::= <Char>+
String ::= '"' <StringChar>* '"'
Number ::= '-'? <Digits> ('.' <Digits>)?
Fraction ::= '-'? <Digits> '/' <Digits>
Digits ::= ('0'..'9')+
Char ::= any non-whitespace, non-# character
StringChar ::= any character other than a double quote