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/History.txt
CHANGED
@@ -1,4 +1,114 @@
|
|
1
|
-
=== 0.1.
|
1
|
+
=== 0.1.6 / 4apr2012
|
2
|
+
* Big things:
|
3
|
+
* allow macros to have receivers
|
4
|
+
* redparse coalescer: coalescer is faster!
|
5
|
+
* nothingness macros:
|
6
|
+
* macros that expand to nil should disappear entirely
|
7
|
+
* except expansion to nothing inside array literal; that makes a nil
|
8
|
+
* NopNode is only deleted in these cases, nilified otherwise:
|
9
|
+
* UndefNode,AssigneeList,ArrayLiteralNode,SequenceNode,ListInNode
|
10
|
+
* 2 new syntaces for form escapes
|
11
|
+
* Little things:
|
12
|
+
* allow macros to work in irb!
|
13
|
+
* error msgs from macros now mention original macro source file
|
14
|
+
* importing macro-specific lexer hacks from rubylexer
|
15
|
+
* moving my RedParse extensions into a module
|
16
|
+
* erase linenumbers of nodes interpolated into elsewhere in a parsetree
|
17
|
+
* put correct linenums in nodes inserted in macro expansion
|
18
|
+
* refine detection of unsupported varargs or block
|
19
|
+
* Reg::Formula objs are defanged when quoted
|
20
|
+
* other Reg objects are left untouched when quoted
|
21
|
+
* hacky node class that just wraps a string and unparses to it
|
22
|
+
* fixed warnings
|
23
|
+
* hacky: form escape (troublesome) level of quotitude error check disabled
|
24
|
+
* Experimental Changes:
|
25
|
+
* optional, experimental macro_expand of forms inline
|
26
|
+
* instead of the usual way: deep_copy of a entry from a pre-built table
|
27
|
+
* Forms and Form Escapes:
|
28
|
+
* added new keyword op: 'v', like unary caret, but very low precedence
|
29
|
+
* and make sure any inputs with the ident v in them get renamed
|
30
|
+
* added yet another syntax for form escapes, enclosed by <+ and +>
|
31
|
+
* support for the argument of a form escape (^) being a splat expr
|
32
|
+
* (^* is needed so 1 formesc can expand to multiple actual exprs)
|
33
|
+
* added rule for 'doubled parens'
|
34
|
+
* (where name of called method is in a form esc)
|
35
|
+
* fixed rule for forms to allow nothing between parens
|
36
|
+
* parens around form escapes in lhs is required right now
|
37
|
+
* Convenience Apis:
|
38
|
+
* allow 1st arg to Macro.eval to be a Node, was required to be a String
|
39
|
+
* added macro-like things for flow control directives (return, next, etc)
|
40
|
+
* methods for listing and deleting all macros in a module
|
41
|
+
* make array in the lexer parameter slot to constructor work
|
42
|
+
* MacroMixin module can be #extend'd to a parser after it's created
|
43
|
+
* in Macro.expand, input can now be an IO
|
44
|
+
* ListInNode[whatever] now works
|
45
|
+
* filename param to Macro.expand defaults to "(eval)" if not given
|
46
|
+
* renamed classes:
|
47
|
+
* renamed RedParseWithMacros class to RedParse::WithMacros
|
48
|
+
* renamed Macro::Macro_ParserMixin to RedParse::MacroMixin,
|
49
|
+
* always keeping old names as an aliases
|
50
|
+
* rubymacros.rb is an alias for macro.rb
|
51
|
+
* first pass at macroruby cmd-line interpreter
|
52
|
+
* like ruby but with macros autoenabled
|
53
|
+
* Serializing/Copying Objects: marshal unparse pretty_print inspect dup clone
|
54
|
+
* FormNode is now marshalable
|
55
|
+
* FormNode is now dup/clone-able
|
56
|
+
* make form escape in assign lhs unparse correctly (needs extra parens)
|
57
|
+
* don't panic if no rescues in MacroNode#unparse
|
58
|
+
* shortcut pretty printing of forms and form escapes (and ListInNodes)
|
59
|
+
* when we know it will just be evaled again
|
60
|
+
* pretty up the #inspect output for FormNode
|
61
|
+
* serialization of FormNode via #inspect works better
|
62
|
+
* Node Api:
|
63
|
+
* made alias names (#body and #text) for the contents of a form
|
64
|
+
* FormParameterNode renamed to FormEscapeNode
|
65
|
+
* made FormEscapeNode#body alias to #val (contents of form esc)
|
66
|
+
* in FormEscapeNode, prefer #body to #first as the name of the contents
|
67
|
+
* FormEscapeNode#initialize now takes just 1 arg (the expr to escape)
|
68
|
+
* tolerate plain array inside MetaClassNode
|
69
|
+
* FormNode's @parameters should be made into ListInNode
|
70
|
+
* Examples:
|
71
|
+
* added a new, more complete unroll implementation
|
72
|
+
* adding 1st pass at handling flow control for some unrolled loops
|
73
|
+
* make deep copies of s-exps duplicated by unroll,
|
74
|
+
* to ensure the tree doesn't become a dag
|
75
|
+
* improvements to inline
|
76
|
+
* hacky manual rebuild_transform on result of inline macro
|
77
|
+
* walk only part of inline result that contains user's original body
|
78
|
+
* don't stop walking inlined method body early
|
79
|
+
* inlined method params should be parenthesized as well as escaped
|
80
|
+
* improvements to with
|
81
|
+
* reimplemented to take a block instead
|
82
|
+
* an even fancier version uses xform_tree!,
|
83
|
+
* but that doesnt work yet, so its disabled
|
84
|
+
* improvements to assert
|
85
|
+
* improved wording of assert err msg in non-op case
|
86
|
+
* improved assert's detection of compare operators
|
87
|
+
* new example, simpified version of assert
|
88
|
+
* added another formless_macro implementation
|
89
|
+
* new example, simple forwarding to a method
|
90
|
+
* inspired by roger pack. not working right now
|
91
|
+
* added a bunch of examples
|
92
|
+
* Tests:
|
93
|
+
* define some more mutators of test data
|
94
|
+
* to check for problems with form escs, etc
|
95
|
+
* a test which verifies each example prints its expected output.
|
96
|
+
* delete existing macros before starting various tests
|
97
|
+
* skip form testcases for test data that are not legal ruby
|
98
|
+
* skipping some random selection of slower tests.
|
99
|
+
* add test/ directory to $: for ruby 1.9
|
100
|
+
* warn, not error on diff in just Node#offset after wrapping in a form
|
101
|
+
* tests of specific features:
|
102
|
+
* first pass at a test for the loop unroller
|
103
|
+
* testing form as receiver of method call seems to work more or less.
|
104
|
+
* test marshaling a particular form that's failing in ruby < 1.9.2
|
105
|
+
* test of escape from inner form
|
106
|
+
* fixed test of second formless macro to actually test the 2nd macro
|
107
|
+
* test macros that expand to nothing
|
108
|
+
* test form escape on assign lhs
|
109
|
+
* testing assertions work right when disabled as well.
|
110
|
+
|
111
|
+
=== 0.1.5 / 4jul2009
|
2
112
|
* 4 Major Enhancements:
|
3
113
|
* all macros are now immediate, not delayed
|
4
114
|
* macro calls can accept blocks
|
@@ -10,18 +120,18 @@
|
|
10
120
|
* forms can now be catenated together with + in the obvious way
|
11
121
|
* HashLiteralNode can be treated somewhat like a real hash, using #get
|
12
122
|
|
13
|
-
=== 0.1.4 /
|
123
|
+
=== 0.1.4 / 21may2009
|
14
124
|
* 1 Major Enhancement:
|
15
125
|
* line numbers are now preserved in preprocessed code;
|
16
126
|
* backtraces should make more sense.
|
17
127
|
* 1 Minor Enhancement:
|
18
128
|
* updated to keep in sync with the latest RedParse api (sigh)
|
19
129
|
|
20
|
-
=== 0.1.3 /
|
130
|
+
=== 0.1.3 / 2may2009
|
21
131
|
* 1 Minor Enhancement:
|
22
132
|
* depend on redparse>=0.8.1, since 0.8.0 had a stupid permission problem
|
23
133
|
|
24
|
-
=== 0.1.2 /
|
134
|
+
=== 0.1.2 / 26apr2009
|
25
135
|
* 7 Minor Enhancements
|
26
136
|
* lots of nice comments added, thanks to Paul Brannan and Tatsuji Kawai
|
27
137
|
* Paul fixed the weird rdoc failure too!
|
@@ -31,7 +141,7 @@
|
|
31
141
|
* in test_form.rb, don't test deep_copy on nil forms
|
32
142
|
* all files should be world-readable now
|
33
143
|
|
34
|
-
=== 0.1.0 /
|
144
|
+
=== 0.1.0 / 24oct2008
|
35
145
|
* 1 Major Enhancement
|
36
146
|
* Birthday!
|
37
147
|
|
data/Makefile
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# rubymacros - a macro preprocessor for ruby
|
2
|
+
# Copyright (C) 2008, 2016 Caleb Clausen
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
name=RubyMacros
|
18
|
+
lname=rubymacros
|
19
|
+
gemname=rubymacros
|
20
|
+
|
21
|
+
lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_8.rb: lib/macro.rb
|
22
|
+
redparse -r=lib/macro.rb --cache=no -o=lib/macro/ -c WithMacros
|
23
|
+
|
24
|
+
lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_9.rb: lib/macro.rb
|
25
|
+
redparse -r=lib/macro.rb --cache=no -o=lib/macro/ -c 'WithMacros 1.9'
|
26
|
+
|
27
|
+
parser: lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_8.rb lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_9.rb
|
28
|
+
.PHONY: parser
|
29
|
+
|
30
|
+
#everything after this line is generic
|
31
|
+
|
32
|
+
version=$(shell ruby -r ./lib/$(lname)/version.rb -e "puts $(name)::VERSION")
|
33
|
+
filelist=$(shell git ls-files)
|
34
|
+
|
35
|
+
.PHONY: all test docs gem tar pkg email
|
36
|
+
all: test
|
37
|
+
|
38
|
+
test:
|
39
|
+
ruby -Ilib test/test_all.rb
|
40
|
+
|
41
|
+
docs:
|
42
|
+
rdoc lib/*
|
43
|
+
|
44
|
+
pkg: gem tar
|
45
|
+
|
46
|
+
gem:
|
47
|
+
gem build $(lname).gemspec
|
48
|
+
|
49
|
+
tar:
|
50
|
+
tar cf - $(filelist) | ( mkdir $(gemname)-$(version); cd $(gemname)-$(version); tar xf - )
|
51
|
+
tar czf $(gemname)-$(version).tar.gz $(gemname)-$(version)
|
52
|
+
rm -rf $(gemname)-$(version)
|
53
|
+
|
54
|
+
email: README.txt History.txt
|
55
|
+
ruby -e ' \
|
56
|
+
require "rubygems"; \
|
57
|
+
load "./$(lname).gemspec"; \
|
58
|
+
spec= Gem::Specification.list.find{|x| x.name=="$(gemname)"}; \
|
59
|
+
puts "\
|
60
|
+
Subject: [ANN] $(name) #{spec.version} Released \
|
61
|
+
\n\n$(name) version #{spec.version} has been released! \n\n\
|
62
|
+
#{Array(spec.homepage).map{|url| " * #{url}\n" }} \
|
63
|
+
\n\
|
64
|
+
#{$(name)::Description} \
|
65
|
+
\n\nChanges:\n\n \
|
66
|
+
#{$(name)::Latest_changes} \
|
67
|
+
"\
|
68
|
+
'
|
data/README.txt
CHANGED
@@ -26,10 +26,6 @@ Although in theory already as powerful as lisp macros, the current
|
|
26
26
|
implementation has a number of problems which added together make it merely
|
27
27
|
a proof of concept or toy at this point:
|
28
28
|
* pre-processing is very, very slow (because of RedParse)
|
29
|
-
* macro calls must be inside some sort of method;
|
30
|
-
* straight out macro calls at the top level won't work
|
31
|
-
* macros can't have blocks or receivers
|
32
|
-
* some ruby syntax is unsupported in files using macros
|
33
29
|
* files using macros must be loaded via Macro.require;
|
34
30
|
* Kernel#require will not recognize macros
|
35
31
|
* macros cannot be scoped
|
@@ -77,7 +73,7 @@ result of an escaped expression (which should be a Node) is interpolated
|
|
77
73
|
into the form at that point. The whole effect is much like that of string
|
78
74
|
interpolations (#{}) inside string literals.
|
79
75
|
|
80
|
-
== How Macros Work
|
76
|
+
== How Macros Work:
|
81
77
|
Typically, macros return a single form literal, which contains form escape
|
82
78
|
expressions within it which make use of the macro's parameters. However,
|
83
79
|
macro bodies may contain anything at all; more complicated macros will
|
@@ -91,6 +87,33 @@ The parsetrees for the arguments to the callsite are passed as arguments to
|
|
91
87
|
the macro. The macro is expected to return a parsetree, which replaces the
|
92
88
|
macro callsite in the parsetree which contained it.
|
93
89
|
|
90
|
+
=== How to use the examples:
|
91
|
+
All the example code in the example/ directory is split into 2 parts; the
|
92
|
+
actual example file itself (say, example/foo.rb) and a wrapper around it
|
93
|
+
(say, example/foo_wrap.rb) which requires 'macro' and then Macro.requires
|
94
|
+
the example itself. To run the examples, you should run the _wrap file, not
|
95
|
+
the example file itself. For example, to try out assert.rb, you would
|
96
|
+
issue this command line:
|
97
|
+
ruby example/assert_wrap.rb
|
98
|
+
The example wrappers all expect to be run from the main rubymacros
|
99
|
+
directory, not the example/ subdirectory.
|
100
|
+
|
101
|
+
I wish this 2-level scheme were not necessary, so that you could directly
|
102
|
+
execute a file containing macros, with perhaps a -rmacro preceding it on
|
103
|
+
the command line. However, it isn't possible to override how the interpreter
|
104
|
+
treats it command line arguments. I would hope that files named on the
|
105
|
+
command line (with or without a -r option) would be pulled in via
|
106
|
+
Kernel#require, but this is not the case.
|
107
|
+
|
108
|
+
|
109
|
+
== Hacker's guide (well, section)
|
110
|
+
If you modify the parse rules (that is, RedParse::MacroMixin#RULES) you will
|
111
|
+
need to recompile them before they will work. To do that, run 'make parser'.
|
112
|
+
This will, unfortunately, take a little while to run. Running 'make parser'
|
113
|
+
will regenerate two files:
|
114
|
+
lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_8.rb
|
115
|
+
lib/macro/ReduceWithsFor_RedParse_RedParse__MacroMixin_RedParse__WithMacros_1_9.rb
|
116
|
+
which normally come pre-generated with rubymacros.
|
94
117
|
|
95
118
|
|
96
119
|
== Known Problems
|
@@ -102,7 +125,7 @@ macro callsite in the parsetree which contained it.
|
|
102
125
|
|
103
126
|
|
104
127
|
== License:
|
105
|
-
Copyright (C) 2008 Caleb Clausen
|
128
|
+
Copyright (C) 2008, 2016 Caleb Clausen
|
106
129
|
|
107
130
|
This program is free software: you can redistribute it and/or modify
|
108
131
|
it under the terms of the GNU Lesser General Public License as published by
|
data/TODO
CHANGED
data/bin/macroruby
ADDED
@@ -0,0 +1,69 @@
|
|
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
|
+
#!/usr/bin/env ruby
|
20
|
+
|
21
|
+
prelude=['require "macro"']
|
22
|
+
|
23
|
+
i=0
|
24
|
+
while i<ARGV.size
|
25
|
+
|
26
|
+
#end of interpreter options?
|
27
|
+
break if /\A(?:[^-]|-?-\z)/===ARGV[i]
|
28
|
+
|
29
|
+
all,er,rest=ARGV[i].match /\A[Sacdhlnpsvwy]*([er])(.*)\z/
|
30
|
+
|
31
|
+
case er
|
32
|
+
when 'r' #input could come from file named w/ -r on cmd line
|
33
|
+
if !rest.empty?
|
34
|
+
prelude<<"Macro.require "+rest.inspect
|
35
|
+
else
|
36
|
+
ARGV[i]=nil
|
37
|
+
prelude<<"Macro.require "+ARGV[i+=1].inspect
|
38
|
+
end
|
39
|
+
ARGV[i]=nil
|
40
|
+
|
41
|
+
when 'e' #input could come from -e string on the cmd line
|
42
|
+
if !rest.empty?
|
43
|
+
prelude<<rest
|
44
|
+
else
|
45
|
+
ARGV[i]=nil
|
46
|
+
prelude<<ARGV[i+=1]
|
47
|
+
end
|
48
|
+
ARGV[i]=nil
|
49
|
+
got_e=true
|
50
|
+
end
|
51
|
+
|
52
|
+
i+=1
|
53
|
+
end
|
54
|
+
|
55
|
+
#input could come from stdin
|
56
|
+
if "-"==ARGV[i] or !ARGV[i]
|
57
|
+
ARGV[i]="-"
|
58
|
+
else
|
59
|
+
prelude<<"Macro.load "+ARGV[i].inspect
|
60
|
+
ARGV[i]=nil
|
61
|
+
end unless got_e
|
62
|
+
|
63
|
+
ARGV.compact!
|
64
|
+
|
65
|
+
ARGV.push "-e", prelude.join('; ')
|
66
|
+
|
67
|
+
p ARGV
|
68
|
+
ruby=RbConfig::CONFIG['bindir']+'/'+RbConfig::CONFIG["ruby_install_name"]
|
69
|
+
#exec ruby,*ARGV #does not return
|
data/example/__dir__.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
|
macro __DIR__
|
2
20
|
:(File.dirname(__FILE__))
|
3
21
|
end
|
data/example/__dir___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/__dir__.rb'
|
3
21
|
|
data/example/andand.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
|
macro andand(a,b)
|
2
20
|
:(^a and ^b)
|
3
21
|
end
|
data/example/andand_wrap.rb
CHANGED
@@ -1,2 +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
|
+
|
1
19
|
require "macro"
|
2
20
|
Macro.require "example/andand"
|
data/example/assert.rb
CHANGED
@@ -1,12 +1,32 @@
|
|
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
|
#this file uses macros! won't parse in normal ruby
|
2
20
|
macro assert(cond)
|
3
21
|
if $Debug
|
4
|
-
if RedParse::OpNode===cond and
|
5
|
-
|
22
|
+
if RedParse::OpNode===cond and
|
23
|
+
/\A(?:[=!][=~]|[<>]=?|===)\Z/===cond.op
|
24
|
+
#left,op,right=*cond
|
25
|
+
left=cond.left; op=cond.op; right=cond.right
|
6
26
|
:(fail 'expected '+^left.unparse+"(==#{^left}) to be "+
|
7
27
|
^op+" "+^right.unparse+"(==#{^right})" unless ^cond)
|
8
28
|
else
|
9
|
-
:(fail "expected #{:(^^cond)}
|
29
|
+
:(fail "I expected that #{:(^^cond)}" unless ^cond)
|
10
30
|
end
|
11
31
|
end
|
12
32
|
end
|
@@ -25,14 +45,15 @@ def test_assert
|
|
25
45
|
assert(a==b) #oops, fails. msg="expected a(==1) to be == b(==2)"
|
26
46
|
rescue Exception=>e
|
27
47
|
assert("expected a(==1) to be == b(==2)"== e.message) #better be ok
|
28
|
-
else
|
48
|
+
else fail "exception expected but was not seen"
|
29
49
|
end
|
30
50
|
|
31
51
|
begin
|
32
|
-
assert(
|
52
|
+
assert(!a) #oops, fails. msg="expected nil, but was not true"
|
33
53
|
rescue Exception=>e
|
34
|
-
assert(
|
35
|
-
|
36
|
-
else puts "exception expected but was not seen"
|
54
|
+
assert(/^I expected that ! *a$/=== e.message) #better be ok
|
55
|
+
else fail "exception expected but was not seen"
|
37
56
|
end
|
57
|
+
|
58
|
+
puts "all assertions passed"
|
38
59
|
end
|