aboutsummaryrefslogtreecommitdiff
path: root/ruby
diff options
context:
space:
mode:
Diffstat (limited to 'ruby')
-rw-r--r--ruby/Makefile2
-rw-r--r--ruby/mal_readline.rb18
-rw-r--r--ruby/step0_repl.rb5
-rw-r--r--ruby/step1_read_print.rb5
-rw-r--r--ruby/step2_eval.rb5
-rw-r--r--ruby/step3_env.rb5
-rw-r--r--ruby/step4_if_fn_do.rb5
-rw-r--r--ruby/step5_tco.rb5
-rw-r--r--ruby/step6_file.rb5
-rw-r--r--ruby/step7_quote.rb5
-rw-r--r--ruby/step8_macros.rb5
-rw-r--r--ruby/step9_interop.rb5
-rw-r--r--ruby/stepA_more.rb5
13 files changed, 52 insertions, 23 deletions
diff --git a/ruby/Makefile b/ruby/Makefile
index bfaa826..71ab92c 100644
--- a/ruby/Makefile
+++ b/ruby/Makefile
@@ -1,6 +1,6 @@
TESTS =
-SOURCES_BASE = types.rb reader.rb printer.rb
+SOURCES_BASE = mal_readline.rb types.rb reader.rb printer.rb
SOURCES_LISP = env.rb core.rb stepA_more.rb
SOURCES = $(SOURCES_BASE) $(SOURCES_LISP)
diff --git a/ruby/mal_readline.rb b/ruby/mal_readline.rb
new file mode 100644
index 0000000..63c5571
--- /dev/null
+++ b/ruby/mal_readline.rb
@@ -0,0 +1,18 @@
+require "readline"
+
+$history_loaded = false
+$histfile = "#{ENV['HOME']}/.mal-history"
+
+def _readline(prompt)
+ if not $history_loaded
+ $history_loaded = true
+ File.readlines($histfile).each {|l| Readline::HISTORY.push(l.chomp)}
+ end
+
+ if line = Readline.readline(prompt, true)
+ File.open($histfile, 'a+') {|f| f.write(line+"\n")}
+ return line
+ else
+ return nil
+ end
+end
diff --git a/ruby/step0_repl.rb b/ruby/step0_repl.rb
index dd32b27..21d534a 100644
--- a/ruby/step0_repl.rb
+++ b/ruby/step0_repl.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
# read
def READ(str)
@@ -20,6 +21,6 @@ def REP(str)
return PRINT(EVAL(READ(str), {}))
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
puts REP(line)
end
diff --git a/ruby/step1_read_print.rb b/ruby/step1_read_print.rb
index 20dd450..617323e 100644
--- a/ruby/step1_read_print.rb
+++ b/ruby/step1_read_print.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -23,7 +24,7 @@ def REP(str)
return PRINT(EVAL(READ(str), {}))
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP(line)
rescue Exception => e
diff --git a/ruby/step2_eval.rb b/ruby/step2_eval.rb
index 9318099..1454d8c 100644
--- a/ruby/step2_eval.rb
+++ b/ruby/step2_eval.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -54,7 +55,7 @@ repl_env[:-] = lambda {|a,b| a - b}
repl_env[:*] = lambda {|a,b| a * b}
repl_env[:/] = lambda {|a,b| a / b}
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step3_env.rb b/ruby/step3_env.rb
index 7266424..88811f0 100644
--- a/ruby/step3_env.rb
+++ b/ruby/step3_env.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -66,7 +67,7 @@ repl_env.set(:-, lambda {|a,b| a - b})
repl_env.set(:*, lambda {|a,b| a * b})
repl_env.set(:/, lambda {|a,b| a / b})
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step4_if_fn_do.rb b/ruby/step4_if_fn_do.rb
index 559f81e..4ae0d86 100644
--- a/ruby/step4_if_fn_do.rb
+++ b/ruby/step4_if_fn_do.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -85,7 +86,7 @@ repl_env.set(:eval, lambda {|ast| EVAL(ast, repl_env)})
# core.mal: defined using the language itself
RE["(def! not (fn* (a) (if a false true)))"]
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step5_tco.rb b/ruby/step5_tco.rb
index c6b5782..e2fe5e7 100644
--- a/ruby/step5_tco.rb
+++ b/ruby/step5_tco.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -94,7 +95,7 @@ repl_env.set(:eval, lambda {|ast| EVAL(ast, repl_env)})
# core.mal: defined using the language itself
RE["(def! not (fn* (a) (if a false true)))"]
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step6_file.rb b/ruby/step6_file.rb
index 6ca0d6d..45de088 100644
--- a/ruby/step6_file.rb
+++ b/ruby/step6_file.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -101,7 +102,7 @@ if ARGV.size > 0
}
exit 0
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step7_quote.rb b/ruby/step7_quote.rb
index 78ef117..e91058b 100644
--- a/ruby/step7_quote.rb
+++ b/ruby/step7_quote.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -121,7 +122,7 @@ if ARGV.size > 0
}
exit 0
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step8_macros.rb b/ruby/step8_macros.rb
index db34159..dd02c4f 100644
--- a/ruby/step8_macros.rb
+++ b/ruby/step8_macros.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -148,7 +149,7 @@ if ARGV.size > 0
}
exit 0
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/step9_interop.rb b/ruby/step9_interop.rb
index ba35146..2c56de4 100644
--- a/ruby/step9_interop.rb
+++ b/ruby/step9_interop.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -150,7 +151,7 @@ if ARGV.size > 0
}
exit 0
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e
diff --git a/ruby/stepA_more.rb b/ruby/stepA_more.rb
index a2fc5cc..697caa3 100644
--- a/ruby/stepA_more.rb
+++ b/ruby/stepA_more.rb
@@ -1,4 +1,5 @@
-require "readline"
+$: << File.expand_path(File.dirname(__FILE__))
+require "mal_readline"
require "types"
require "reader"
require "printer"
@@ -166,7 +167,7 @@ if ARGV.size > 0
}
exit 0
end
-while line = Readline.readline("user> ", true)
+while line = _readline("user> ")
begin
puts REP[line]
rescue Exception => e