rpl.rb/lib/rpl/core/store.rb
Gwenhael Le Moine 8b07724e50
make it a gem
2022-02-15 17:06:19 +01:00

124 lines
4.5 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# frozen_string_literal: true
module RplLang
module Core
module Store
def populate_dictionary
super
@dictionary.add_word( ['▶', 'sto'],
'Store',
'( content name -- ) store to variable',
proc do
args = stack_extract( [%i[name], :any] )
@dictionary.add_var( args[0][:value],
args[1] )
end )
@dictionary.add_word( ['rcl'],
'Store',
'( name -- … ) push content of variable name onto stack',
proc do
args = stack_extract( [%i[name]] )
content = @dictionary.lookup( args[0][:value] )
@stack << content unless content.nil?
end )
@dictionary.add_word( ['purge'],
'Store',
'( name -- ) delete variable',
proc do
args = stack_extract( [%i[name]] )
@dictionary.remove_var( args[0][:value] )
end )
@dictionary.add_word( ['vars'],
'Store',
'( -- […] ) list variables',
proc do
@stack << { type: :list,
value: (@dictionary.vars.keys + @dictionary.local_vars_layers.reduce([]) { |memo, layer| memo + layer.keys }).map { |name| { type: :name, value: name } } }
end )
@dictionary.add_word( ['clusr'],
'Store',
'( -- ) delete all variables',
proc do
@dictionary.remove_all_vars
end )
@dictionary.add_word( ['sto+'],
'Store',
'( a n -- ) add content to variable\'s value',
proc do
run( '
dup type "name" ==
« swap »
ift
over rcl + swap sto' )
end )
@dictionary.add_word( ['sto-'],
'Store',
'( a n -- ) subtract content to variable\'s value',
proc do
run( '
dup type "name" ==
« swap »
ift
over rcl swap - swap sto' )
end )
@dictionary.add_word( ['sto×', 'sto*'],
'Store',
'( a n -- ) multiply content of variable\'s value',
proc do
run( '
dup type "name" ==
« swap »
ift
over rcl * swap sto' )
end )
@dictionary.add_word( ['sto÷', 'sto/'],
'Store',
'( a n -- ) divide content of variable\'s value',
proc do
run( '
dup type "name" ==
« swap »
ift
over rcl swap / swap sto' )
end )
@dictionary.add_word( ['sneg'],
'Store',
'( a n -- ) negate content of variable\'s value',
proc do
run( 'dup rcl chs swap sto' )
end )
@dictionary.add_word( ['sinv'],
'Store',
'( a n -- ) invert content of variable\'s value',
proc do
run( 'dup rcl inv swap sto' )
end )
@dictionary.add_word( ['↴', 'lsto'],
'Program',
'( content name -- ) store to local variable',
proc do
args = stack_extract( [%i[name], :any] )
@dictionary.add_local_var( args[0][:value],
args[1] )
end )
end
end
end
end