rubymacros 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -0
- data/COPYING.LGPL +503 -158
- data/History.txt +115 -5
- data/Makefile +68 -0
- data/README.txt +29 -6
- data/TODO +1 -0
- data/bin/macroruby +69 -0
- data/example/__dir__.rb +18 -0
- data/example/__dir___wrap.rb +18 -0
- data/example/andand.rb +18 -0
- data/example/andand_wrap.rb +18 -0
- data/example/assert.rb +29 -8
- data/example/assert0.rb +11 -0
- data/example/assert0_wrap.rb +5 -0
- data/example/assert_does_nothing_when_disabled.rb +19 -0
- data/example/assert_wrap.rb +21 -0
- data/example/expected_output.txt +88 -0
- data/example/formless_macro.rb +123 -0
- data/example/formless_macro_wrap.rb +20 -0
- data/example/inline.rb +97 -0
- data/example/linenum.rb +19 -1
- data/example/linenum_user.rb +18 -0
- data/example/linenum_wrap.rb +18 -0
- data/example/loop.rb +18 -0
- data/example/loop_wrap.rb +18 -0
- data/example/meta.rb +25 -0
- data/example/meta_wrap.rb +20 -0
- data/example/nilresult.rb +26 -0
- data/example/nilresult_wrap.rb +21 -0
- data/example/pipeline.rb +37 -0
- data/example/rescuing.rb +33 -0
- data/example/rescuing_wrap.rb +21 -0
- data/example/role.rb +103 -0
- data/example/role_with_eval.rb +92 -0
- data/example/self_in_class.rb +27 -0
- data/example/separated_scope.rb +42 -0
- data/example/separated_scope_wrap.rb +20 -0
- data/example/simple.rb +18 -0
- data/example/simple_wrap.rb +18 -0
- data/example/unproc.rb +31 -0
- data/example/unproc_wrap.rb +21 -0
- data/example/unroll.rb +34 -0
- data/example/unroll_macros.rb +119 -0
- data/example/unroll_wrap.rb +22 -0
- data/example/with.rb +50 -7
- data/example/with_wrap.rb +19 -0
- data/lib/macro.rb +307 -72
- data/lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_8.rb +18880 -0
- data/lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_9.rb +19101 -0
- data/lib/macro/form.rb +136 -27
- data/lib/macro/node.rb +64 -0
- data/lib/macro/version.rb +2 -5
- data/lib/rubymacros.rb +19 -0
- data/lib/rubymacros/version.rb +23 -0
- data/lib/weakkeyhash.rb +18 -0
- data/rubymacros.gemspec +60 -0
- data/test/test_all.rb +27 -2
- data/test/test_examples.rb +91 -0
- data/test/test_expand.rb +56 -1
- data/test/test_form.rb +108 -10
- data/test/test_unroll.rb +120 -0
- metadata +93 -65
- data/Rakefile +0 -37
data/example/linenum_wrap.rb
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
1
19
|
require 'macro'
|
2
20
|
Macro.require 'example/linenum.rb'
|
3
21
|
|
data/example/loop.rb
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
1
19
|
=begin doesn't work yet
|
2
20
|
macro loop(&body)
|
3
21
|
:(while true
|
data/example/loop_wrap.rb
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
1
19
|
require 'macro'
|
2
20
|
Macro.require 'example/loop.rb'
|
3
21
|
|
data/example/meta.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
module X
|
20
|
+
class<<self
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class<<self
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
require "macro"
|
20
|
+
Macro.require "example/meta.rb"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
macro nilresult
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
nilresult
|
25
|
+
|
26
|
+
p Macro.expand( "a; nilresult; b" ).unparse
|
@@ -0,0 +1,21 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
require 'macro'
|
20
|
+
Macro.require 'example/nilresult'
|
21
|
+
|
data/example/pipeline.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
macro pipeline stages
|
20
|
+
result=:(begin end)
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
=begin
|
26
|
+
(0..9).map{|n| n+100 }.select{|n| n%2==0 }.inject(0){|sum,n| sum+n }
|
27
|
+
|
28
|
+
begin
|
29
|
+
sum=0
|
30
|
+
for x in (0..9)
|
31
|
+
x=x+100
|
32
|
+
next if x%2==0
|
33
|
+
sum=sum+x
|
34
|
+
end
|
35
|
+
sum
|
36
|
+
end
|
37
|
+
=end
|
data/example/rescuing.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
macro rescuing_vars(method)
|
20
|
+
method.body=:(
|
21
|
+
begin
|
22
|
+
^method.body
|
23
|
+
rescue => e; puts "rescuing" ; #raise
|
24
|
+
end
|
25
|
+
)
|
26
|
+
return method
|
27
|
+
end
|
28
|
+
|
29
|
+
rescuing_vars def foo
|
30
|
+
bar
|
31
|
+
end
|
32
|
+
|
33
|
+
foo
|
@@ -0,0 +1,21 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
require 'macro'
|
20
|
+
Macro.require 'example/rescuing'
|
21
|
+
|
data/example/role.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
# Role base class. Use SimpleDelegator instead?
|
20
|
+
class Role
|
21
|
+
def initialize(mappings)
|
22
|
+
@mappings = mappings
|
23
|
+
end
|
24
|
+
attr :mappings
|
25
|
+
end
|
26
|
+
|
27
|
+
# Context (UseCase) base class.
|
28
|
+
class Context
|
29
|
+
end
|
30
|
+
|
31
|
+
macro context_class name, roles, verbs
|
32
|
+
lc_roles=roles.map{|role|
|
33
|
+
ConstantNode===role or fail
|
34
|
+
role.unparse.downcase.gsub("::","__")
|
35
|
+
}
|
36
|
+
sym_roles=lc_roles.map{|role|
|
37
|
+
LiteralNode[role]
|
38
|
+
}
|
39
|
+
at_roles=lc_roles.map{|role|
|
40
|
+
VarNode["@"+role]
|
41
|
+
}
|
42
|
+
var_roles=lc_roles.map{|role|
|
43
|
+
VarNode[role]
|
44
|
+
}
|
45
|
+
:(
|
46
|
+
# We can think of a context as setting a scene.
|
47
|
+
class ^name < Context
|
48
|
+
attr_accessor ^*sym_roles
|
49
|
+
def initialize(^*var_roles)
|
50
|
+
^*at_roles = ^*var_roles
|
51
|
+
end
|
52
|
+
^verbs.map{|verb| context_verb(^*verb) }
|
53
|
+
end
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
macro context_verb(name, *args)
|
58
|
+
:(:(
|
59
|
+
def ^^name(^^*args,&block)
|
60
|
+
^*roles.zip(at_roles).map{|role,var|
|
61
|
+
:((^var).(^eval(role.unparse).mappings[name])(^^*args,&block))
|
62
|
+
}
|
63
|
+
end
|
64
|
+
))
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
# --- example ---
|
70
|
+
|
71
|
+
# Mixins are fixed roles.
|
72
|
+
class Balance
|
73
|
+
def initialize
|
74
|
+
@balance = 0
|
75
|
+
end
|
76
|
+
def availableBalance
|
77
|
+
@balance
|
78
|
+
end
|
79
|
+
def increaseBalance(amount)
|
80
|
+
@balance += amount
|
81
|
+
puts "Tranfered from account #{__id__} $#{amount}"
|
82
|
+
end
|
83
|
+
def decreaseBalance(amount)
|
84
|
+
@balance -= amount
|
85
|
+
puts "Tranfered to account #{__id__} $#{amount}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
Balance::TransferSource= Role.new :transfer => :decreaseBalance
|
90
|
+
Balance::TransferDestination= Role.new :transfer => :increaseBalance
|
91
|
+
|
92
|
+
context_class Balance::Transfer,
|
93
|
+
Balance::TransferSource, Balance::TransferDestination,
|
94
|
+
[transfer, amount]
|
95
|
+
|
96
|
+
class Account<Balance
|
97
|
+
# An account by definition has a balance.
|
98
|
+
end
|
99
|
+
|
100
|
+
acct1 = Account.new
|
101
|
+
acct2 = Account.new
|
102
|
+
|
103
|
+
Balance::Transfer.new(acct1, acct2).transfer(50)
|
@@ -0,0 +1,92 @@
|
|
1
|
+
=begin
|
2
|
+
rubymacros - a macro preprocessor for ruby
|
3
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
4
|
+
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU Lesser General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU Lesser General Public License
|
16
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
|
19
|
+
def Context roles, verbs
|
20
|
+
lc_roles=roles.map{|role|
|
21
|
+
role.downcase.gsub("::","__")
|
22
|
+
}
|
23
|
+
sym_roles=lc_roles.map{|role|
|
24
|
+
":"+role
|
25
|
+
}.join(',')
|
26
|
+
at_roles=lc_roles.map{|role|
|
27
|
+
"@"+role
|
28
|
+
}
|
29
|
+
var_roles=lc_roles.join(',')
|
30
|
+
result=Class.new(Context)
|
31
|
+
result.class_eval "
|
32
|
+
# We can think of a context as setting a scene.
|
33
|
+
attr_accessor #{sym_roles}
|
34
|
+
def initialize(#{var_roles})
|
35
|
+
#{at_roles.join ','} = #{var_roles}
|
36
|
+
end
|
37
|
+
#{verbs.map{|verb| Context.verb(roles.zip(at_roles), verb) }.join("\n")}
|
38
|
+
"
|
39
|
+
return result
|
40
|
+
end
|
41
|
+
|
42
|
+
# Context (UseCase) base class.
|
43
|
+
class Context
|
44
|
+
def self.verb(roles_n_vars, name)
|
45
|
+
"
|
46
|
+
def #{name}(*args, &block)
|
47
|
+
#{roles_n_vars.map{|role,var|
|
48
|
+
"#{var}.#{eval(role)[name.to_sym]}(*args, &block)"
|
49
|
+
}.join("\n")}
|
50
|
+
end
|
51
|
+
"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
# --- example ---
|
58
|
+
|
59
|
+
# Mixins are fixed roles.
|
60
|
+
class Balance
|
61
|
+
def initialize
|
62
|
+
@balance = 0
|
63
|
+
end
|
64
|
+
def availableBalance
|
65
|
+
@balance
|
66
|
+
end
|
67
|
+
def increaseBalance(amount)
|
68
|
+
@balance += amount
|
69
|
+
puts "Tranfered from account #{__id__} $#{amount}"
|
70
|
+
end
|
71
|
+
def decreaseBalance(amount)
|
72
|
+
@balance -= amount
|
73
|
+
puts "Tranfered to account #{__id__} $#{amount}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
Balance::TransferSource= { :transfer => :decreaseBalance }
|
78
|
+
Balance::TransferDestination= { :transfer => :increaseBalance }
|
79
|
+
|
80
|
+
Balance::Transfer=Context(
|
81
|
+
%w[Balance::TransferSource Balance::TransferDestination],
|
82
|
+
%w[transfer]
|
83
|
+
)
|
84
|
+
|
85
|
+
class Account<Balance
|
86
|
+
# An account by definition has a balance.
|
87
|
+
end
|
88
|
+
|
89
|
+
acct1 = Account.new
|
90
|
+
acct2 = Account.new
|
91
|
+
|
92
|
+
Balance::Transfer.new(acct1, acct2).transfer(50)
|