Project

lrb

0.0
Repository is archived
No release in over 3 years
It transform Ruby to a Lisp with braces, included REPL and COMPILE mode.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

~> 0
~> 0
~> 0
 Project Readme

Lispy Ruby

[LRB] transform Ruby to a Lisp with braces, remain all ruby keywords and same funtionalities.

Gem: https://rubygems.org/gems/lrb

* Install:

gem install lrb

* To Start REPL:

lrb

* for debug mode:

[debug] 

* To compile & run a source file:

lrb test.lrb

* LRB source look like lisp, but with braces:

[require "colorize"]

[def [square x]
  [* x x]
]

[def [factorial acc n]
  [if [< n 1]
    acc
    [factorial [* acc n] [- n 1]]]]


[puts [square 10]]
[puts [factorial 1 10]]


[def [single_exp]
  [puts "only block !"]
]

[def [multiple_exps][
    [puts "1st statement"]
    [puts "2nd statement"]
  ]
]

[single_exp]
[multiple_exps]


[puts [== 1 1]]

[= name :Trung.to_s ]
[puts name]
[puts [+ "Hello " name " \!"]]

[= lst [list 1 2 3]]
[= lst Array.new]
[<< lst 4]
[puts lst.to_s.blue]

[puts [.to_s.blue [+ "Heell" "o"]]]

[do [.map [list 1 2 3]] [n][
    [puts n]
  ]
]

[unless [< 1 0]
  [puts "one is not lesser than zero"]
  [puts "you're doomed."]
]

[= square 
  [lambda [x]
    [* x x]
  ]
]

[puts 
  [.to_s.blue [square.call 2]]]

[def [argumented x=2] 
  [puts x]
]

[argumented]


[cond 
  [< 1 0] [puts "1 < 0"]
  [> 3 4] [puts "3 > 4"]
  [<= 1 0] [puts "1 <= 0"]
  [>= 1 0] [puts "1 >= 0"]
  true    [puts "as always"]
]

* By then, LRB compile down into Ruby:

require "colorize"

def square x
  x * x
end

def factorial acc, n
  if n < 1
    acc
  else
    factorial acc * n, n - 1
  end
end

puts square 10

puts factorial 1, 10

def single_exp 
  puts "only block !"
end

def multiple_exps 
  puts "1st statement"
  puts "2nd statement"
end

single_exp 

multiple_exps 

puts 1 == 1

name = :Trung.to_s

puts name

puts "Hello " + name + " !"

lst = [1, 2, 3]

lst = Array.new

lst << 4

puts lst.to_s.blue

puts ("Heell" + "o").to_s.blue

([1, 2, 3]).map do |n|
  puts n
end

unless 1 < 0
    puts "one is not lesser than zero"
  else
    puts "you're doomed."
  end

square = lambda {|x|
  x * x
}

puts (square.call 2).to_s.blue

def argumented x=2
  puts x
end

argumented 

if 1 < 0
  puts "1 < 0"
elsif 3 > 4
  puts "3 > 4"
elsif 1 <= 0
  puts "1 <= 0"
elsif 1 >= 0
  puts "1 >= 0"
elsif true
  puts "as always"
end

* And evaluate everything:

[evaluated]:
100
3628800
only block !
1st statement
2nd statement
true
Trung
Hello Trung !
[4]
Heello
1
2
3
one is not lesser than zero
4
2
1 >= 0

Currently, it's only experiment toy, not yet support repl or macros.

Have fun !