124 lines
4.5 KiB
Ruby
124 lines
4.5 KiB
Ruby
# 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
|