From 4585907bafa376d9951732e2d8fc4be2c69c8206 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Thu, 5 Sep 2024 00:17:18 +0100 Subject: [goforthanddie.rb] Major changes: readline, ><, count --- goforthanddie.rb | 73 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 31 deletions(-) (limited to 'goforthanddie.rb') diff --git a/goforthanddie.rb b/goforthanddie.rb index 5e4af9e..cf24acd 100755 --- a/goforthanddie.rb +++ b/goforthanddie.rb @@ -1,15 +1,28 @@ #!/usr/bin/env ruby +trap("INT") do + quit +end + +def quit + hfile = File.join(ENV['HOME'], ".goforthanddie_history") + File.open(hfile, ?w) do |f| + f.puts(Readline::HISTORY.to_a) + f.flush + end + exit +end + def getlist(stack, markermode, markerautoclear) if markermode h = [] wm = false loop do + break if stack.empty? t = stack.pop wm = t == :mark break if wm h << t - break if stack.empty? end stack.push(:mark) if wm && !markerautoclear h.reverse @@ -20,7 +33,6 @@ def getlist(stack, markermode, markerautoclear) end def handle(str, stack, markermode, markerautoclear, destructiveprint) - exit if str.nil? str.split.each do |token| case token when /\A[+-]?[0-9]+\Z/ @@ -95,46 +107,29 @@ def handle(str, stack, markermode, markerautoclear, destructiveprint) h = getlist(stack, markermode, markerautoclear) h.sort! stack.push(*h.shift(k)) - when ">", "gt", "greaterthan" - c = stack.pop - h = stack.pop - stack.push(c > h ? 1 : 0) when ".>", ".gt", ".greaterthan" c = stack.pop h = getlist(stack, markermode, markerautoclear) - stack.push(h.count{ |d| c > d }) - when ">=", "gteq", "greaterthanorequalto" - c = stack.pop - h = stack.pop - stack.push(c >= h ? 1 : 0) + stack.push(*h.select{ |d| d > c }) when ".>=", ".gteq", ".greaterthanorequalto" c = stack.pop h = getlist(stack, markermode, markerautoclear) - stack.push(h.count{ |d| c >= d }) - when "=", "eq", "equalto" - c = stack.pop - h = stack.pop - stack.push(c == h ? 1 : 0) + stack.push(*h.select{ |d| d >= c }) when ".=", ".eq", ".equalto" c = stack.pop h = getlist(stack, markermode, markerautoclear) - stack.push(h.count{ |d| c == d }) - when "<=", "lteq", "lessthanorequalto" - c = stack.pop - h = stack.pop - stack.push(c <= h ? 1 : 0) + stack.push(*h.select{ |d| d == c }) when ".<=", ".lteq", ".lessthanorequalto" c = stack.pop h = getlist(stack, markermode, markerautoclear) - stack.push(h.count{ |d| c <= d }) - when "<", "lt", "lessthan" - c = stack.pop - h = stack.pop - stack.push(c < h ? 1 : 0) + stack.push(*h.select{ |d| d <= c }) when ".<", ".lt", ".lessthan" c = stack.pop h = getlist(stack, markermode, markerautoclear) - stack.push(h.count{ |d| c < d }) + stack.push(*h.select{ |d| d < c }) + when ".count" + h = getlist(stack, markermode, markerautoclear) + stack.push(h.count) when "!", "drop" stack.pop when ".!", ".drop" @@ -174,7 +169,7 @@ def handle(str, stack, markermode, markerautoclear, destructiveprint) puts " %#{namemax}s: #{defn}" % "'#{name}" end when "~q", "~quit" - exit + quit else puts "I don't know how to #{token}!" end @@ -188,10 +183,26 @@ mac = false dp = true if $stdin.tty? - loop do - print "> " - mm, mac, dp = handle(gets, stk, mm, mac, dp) + begin + require "readline" + rescue LoadError + Gem.install "readline" + Gem.install "readline-ext" + retry end + + hfile = File.join(ENV['HOME'], ".goforthanddie_history") + if File.exist?(hfile) + File.readlines(hfile).each do |line| + Readline::HISTORY << line.strip + end + end + + while buf = Readline.readline("> ", true) + mm, mac, dp = handle(buf, stk, mm, mac, dp) + end + + quit else mm, mac, dp = handle($stdin.read, stk, mm, mac, dp) end -- cgit v1.2.1