Ruby,Python,C#: readline history fixes. Ruby include path.
authorJoel Martin <github@martintribe.org>
Fri, 18 Apr 2014 03:23:07 +0000 (22:23 -0500)
committerJoel Martin <github@martintribe.org>
Fri, 18 Apr 2014 03:23:07 +0000 (22:23 -0500)
16 files changed:
cs/getline.cs
docs/TODO
python/mal_readline.py
ruby/Makefile
ruby/mal_readline.rb [new file with mode: 0644]
ruby/step0_repl.rb
ruby/step1_read_print.rb
ruby/step2_eval.rb
ruby/step3_env.rb
ruby/step4_if_fn_do.rb
ruby/step5_tco.rb
ruby/step6_file.rb
ruby/step7_quote.rb
ruby/step8_macros.rb
ruby/step9_interop.rb
ruby/stepA_more.rb

index b6dcf07..c11a11d 100644 (file)
@@ -895,8 +895,9 @@ namespace Mono.Terminal {
                                        throw new ArgumentException ("size");
 
                                if (app != null){
-                                       string dir = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
+                                       string dir = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
                                        //Console.WriteLine (dir);
+                                       /*
                                        if (!Directory.Exists (dir)){
                                                try {
                                                        Directory.CreateDirectory (dir);
@@ -906,6 +907,8 @@ namespace Mono.Terminal {
                                        }
                                        if (app != null)
                                                histfile = Path.Combine (dir, app) + ".history";
+                                       */
+                                       histfile = Path.Combine (dir, ".mal-history");
                                }
                                
                                history = new string [size];
index c930055..e159535 100644 (file)
--- a/docs/TODO
+++ b/docs/TODO
@@ -17,13 +17,13 @@ All:
 ---------------------------------------------
 
 Bash:
+    - explore using ${!prefix*} syntax (more like make impl)
 
 C:
     - come up with better way to do 20 vararg code
 
 C#:
     - step9_interop
-    - use same history file
 
 Clojure:
 
@@ -37,7 +37,6 @@ Make:
     - allow '_' in make variable names
     - errors should propagate up from within load-file
 
-
 Mal:
     - line numbers in errors
     - step6_file: command line arguments
@@ -52,8 +51,6 @@ Postscript:
 Python:
 
 Ruby:
-    - save history and use same history file
-    - setup require search path
 
 
 ---------------------------------------------
index 2add6b5..fc22b58 100644 (file)
@@ -8,7 +8,9 @@ else:
     rl = raw_input
 
 def readline(prompt="user> "):
+    global history_loaded
     if not history_loaded:
+        history_loaded = True
         try:
             with open(histfile, "r") as hf:
                 for line in hf.readlines():
index bfaa826..71ab92c 100644 (file)
@@ -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 (file)
index 0000000..63c5571
--- /dev/null
@@ -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
index dd32b27..21d534a 100644 (file)
@@ -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
index 20dd450..617323e 100644 (file)
@@ -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
index 9318099..1454d8c 100644 (file)
@@ -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
index 7266424..88811f0 100644 (file)
@@ -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
index 559f81e..4ae0d86 100644 (file)
@@ -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
index c6b5782..e2fe5e7 100644 (file)
@@ -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
index 6ca0d6d..45de088 100644 (file)
@@ -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
index 78ef117..e91058b 100644 (file)
@@ -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
index db34159..dd02c4f 100644 (file)
@@ -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
index ba35146..2c56de4 100644 (file)
@@ -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
index a2fc5cc..697caa3 100644 (file)
@@ -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