class Alda::REPL
An instance of this class is an REPL session.
It provides an Alda::REPL::TempScore
for you to operate on. To see what methods you can call in an REPL session, see instance methods of Alda::REPL::TempScore
.
The session uses “> ” to indicate your input. Your input should be ruby codes, and the codes will be sent to an Alda::REPL::TempScore
and executed.
After executing the ruby codes, if the score is not empty, it is played, and the translated alda codes are printed.
Note that every time your ruby codes input is executed, the score is cleared beforehand. To check the result of your previous input, run puts history
.
Unlike IRB, this REPL does not print the result of the executed codes. Use p
if you want.
Interrupt
and SystemExit
exceptions are rescued and will not cause the process terminating. exit
terminates the REPL session instead of the process.
To start an REPL session in a ruby program, use Alda::repl
. To start an REPL session conveniently from command line, run command ruby -ralda-rb -e "Alda.repl"
.
$ ruby -ralda-rb -e "Alda.repl" > puts status [27713] Server up (2/2 workers available, backend port: 33245) > piano_ c d e f [piano: c d e f] > 5.times do > c > end c c c c c > puts history [piano: c d e f] c c c c c > play > save 'temp.alda' > puts `cat temp.alda` [piano: c d e f] c c c c c > system 'rm temp.alda' > exit
Attributes
The history.
Public Class Methods
Creates a new Alda::REPL
.
# File lib/alda-rb/repl.rb, line 125 def initialize @score = TempScore.new self @binding = @score.get_binding @lex = RubyLex.new @history = StringIO.new end
Public Instance Methods
Clears history
.
# File lib/alda-rb/repl.rb, line 241 def clear_history @history = StringIO.new nil end
Plays the score by sending code
to command line alda.
# File lib/alda-rb/repl.rb, line 219 def play_score code try_command do Alda.play code: code, history: @history @history.puts code end end
Processes the Ruby codes read. Sends it to a score and sends the result to command line alda. Returns false
for breaking the REPL main loop, true
otherwise.
# File lib/alda-rb/repl.rb, line 181 def process_rb_code code @score.clear begin @binding.eval code rescue StandardError, ScriptError => e $stderr.print e.full_message return true rescue Interrupt return true rescue SystemExit return false end code = @score.events_alda_codes unless code.empty? $stdout.puts code.yellow play_score code end true end
Reads and returns the next Ruby codes input in the REPL session. It can intelligently continue reading if the code is not complete yet.
# File lib/alda-rb/repl.rb, line 160 def rb_code result = '' begin buf = Readline.readline '> '.green, true return unless buf result.concat buf, ?\n ltype, indent, continue, block_open = @lex.check_state result rescue Interrupt $stdout.puts retry end while ltype || indent.nonzero? || continue || block_open result end
Runs the session. Includes the start, the main loop, and the termination.
# File lib/alda-rb/repl.rb, line 138 def run start while code = rb_code break unless process_rb_code code end terminate end
Starts the session. Currently does nothing.
# File lib/alda-rb/repl.rb, line 151 def start end
Tries to run the block and rescue Alda::CommandLineError
.
# File lib/alda-rb/repl.rb, line 206 def try_command begin yield rescue Alda::CommandLineError => e puts e.message.red end end