made it work, more or less, with ruby 1.9
[nyuron.git] / classes / environment.rb
blobf9c87215191b118cfde241653af218794f458f81
1 ## An Environment is used when executing commands. It provides short ways of accessing
2 ## information. For example:
3 ## * arg returns the string inserted after the command.
4 ## * name returns the name of the command
5 ## * rest2 returns the rest after the second argument.
6 ##
7 ##  env = Environment.new
8 ##  env.string = "test"
9 ##  code = "print(@string)"
10 ##  env.run(code) ## prints the string "test"
12 class Environment
13         include API
15         attr_accessor(*%w(
16                 string words rests name
17                 word_number cursor_pos key
18         ))
20         ## creates a new, empty environment.
21         def initialize
22                 @args = @words = []
23                 @rests = []
24         end
26         ## before running code, it's a good idea to use the attribute accessors to set
27         ## environmental variables. these are:
28         ## * name=
29         ## * string=
30         ## * words=
31         ## * rests=
32         ## * key=
33         ## * word_number=
34         ## * cursor_pos=
35         def run(code)
36                 begin
37                         eval(code)
38                 rescue StandardError, ScriptError
39                         Console.raise
40                 end
41         end
43         ## returns the rest after the word n. methods with the name
44         ## restN with N from 0 to 15 are generated for more comfortable use.
45         ##
46         ## It's a bit confusing where the counting begins, so I add an example:
47         ##
48         ## if the command is "set filter salt & pepper"
49         ## * rest(0) => "filter salt & pepper"
50         ## * rest(1) => "salt & pepper"
51         ## * rest(2) => "& pepper"
52         def rest(n=0)
53                 (@rests.is_a?(Array) && @rests[n]) || ""
54         end
56         ## returns the nth space-seperated word. methods with the name
57         ## wordN for n from 0 to 15 are generated for more comfortable use.
58         ##
59         ##
60         ## It's a bit confusing where the counting begins, so I add an example:
61         ##
62         ## if the command is "set filter salt & pepper"
63         ## * word(0) => "set"
64         ## * word(1) => "filter"
65         ## * word(2) => "salt
66         def word(n=0)
67                 (@words.is_a?(Array) && @words[n]) || ""
68         end
70         ## arg is an alias for word: @words == @args, wordN == argN, word(N) == arg(N)
71         alias arg word
73         def at_word(n)
74                 if Range === n
75                         n === @word_number
76                 else
77                         @word_number == n
78                 end
79         end
81         for i in 0..16
82                 eval <<-DONE
83                         def word#{i}() word #{i} end
84                         def rest#{i}() rest #{i} end
85                         alias arg#{i} word#{i}
86                 DONE
87         end
88 end