@@ -42,31 +42,34 @@ isassumption(expr) = :(false)
42
42
# ################
43
43
44
44
"""
45
- @model(body )
45
+ @model(expr[, warn = true] )
46
46
47
47
Macro to specify a probabilistic model.
48
48
49
- Example:
49
+ If `warn` is `true`, a warning is displayed if internal variable names are used in the model
50
+ definition.
51
+
52
+ # Example
50
53
51
54
Model definition:
52
55
53
56
```julia
54
- @model model_generator(x = default_x, y) = begin
57
+ @model function model_generator(x = default_x, y)
55
58
...
56
59
end
57
60
```
58
61
59
62
To generate a `Model`, call `model_generator(x_value)`.
60
63
"""
61
- macro model (expr)
62
- esc (model (expr))
64
+ macro model (expr, warn = true )
65
+ esc (model (expr, warn ))
63
66
end
64
67
65
- function model (expr)
68
+ function model (expr, warn )
66
69
modelinfo = build_model_info (expr)
67
70
68
71
# Generate main body
69
- modelinfo[:modelbody ] = generate_mainbody (modelinfo[:body ], modelinfo[:modelargs ])
72
+ modelinfo[:modelbody ] = generate_mainbody (modelinfo[:body ], modelinfo[:modelargs ], warn )
70
73
71
74
return build_output (modelinfo)
72
75
end
@@ -161,50 +164,53 @@ function build_model_info(input_expr)
161
164
end
162
165
163
166
"""
164
- generate_mainbody(expr, args)
167
+ generate_mainbody(expr, args, warn )
165
168
166
169
Generate the body of the main evaluation function from expression `expr` and arguments
167
170
`args`.
171
+
172
+ If `warn` is true, a warning is displayed if internal variables are used in the model
173
+ definition.
168
174
"""
169
- generate_mainbody (expr, args) = generate_mainbody! (Symbol[], expr, args)
175
+ generate_mainbody (expr, args, warn ) = generate_mainbody! (Symbol[], expr, args, warn )
170
176
171
- generate_mainbody! (found, x, args) = x
172
- function generate_mainbody! (found, sym:: Symbol , args)
173
- if sym in INTERNALNAMES && sym ∉ found
177
+ generate_mainbody! (found, x, args, warn ) = x
178
+ function generate_mainbody! (found, sym:: Symbol , args, warn )
179
+ if warn && sym in INTERNALNAMES && sym ∉ found
174
180
@warn " you are using the internal variable `$(sym) `"
175
181
push! (found, sym)
176
182
end
177
183
return sym
178
184
end
179
- function generate_mainbody! (found, expr:: Expr , args)
185
+ function generate_mainbody! (found, expr:: Expr , args, warn )
180
186
# Do not touch interpolated expressions
181
187
expr. head === :$ && return expr. args[1 ]
182
188
183
189
# Apply the `@.` macro first.
184
190
if Meta. isexpr (expr, :macrocall ) && length (expr. args) > 1 &&
185
191
expr. args[1 ] === Symbol (" @__dot__" )
186
- return generate_mainbody! (found, Base. Broadcast. __dot__ (expr. args[end ]), args)
192
+ return generate_mainbody! (found, Base. Broadcast. __dot__ (expr. args[end ]), args, warn )
187
193
end
188
194
189
195
# Modify dotted tilde operators.
190
196
args_dottilde = getargs_dottilde (expr)
191
197
if args_dottilde != = nothing
192
198
L, R = args_dottilde
193
- return Base . remove_linenums! ( generate_dot_tilde (generate_mainbody! (found, L, args),
194
- generate_mainbody! (found, R, args),
195
- args))
199
+ return generate_dot_tilde (generate_mainbody! (found, L, args, warn ),
200
+ generate_mainbody! (found, R, args, warn ),
201
+ args) |> Base . remove_linenums!
196
202
end
197
203
198
204
# Modify tilde operators.
199
205
args_tilde = getargs_tilde (expr)
200
206
if args_tilde != = nothing
201
207
L, R = args_tilde
202
- return Base . remove_linenums! ( generate_tilde (generate_mainbody! (found, L, args),
203
- generate_mainbody! (found, R, args),
204
- args))
208
+ return generate_tilde (generate_mainbody! (found, L, args, warn ),
209
+ generate_mainbody! (found, R, args, warn ),
210
+ args) |> Base . remove_linenums!
205
211
end
206
212
207
- return Expr (expr. head, map (x -> generate_mainbody! (found, x, args), expr. args)... )
213
+ return Expr (expr. head, map (x -> generate_mainbody! (found, x, args, warn ), expr. args)... )
208
214
end
209
215
210
216
0 commit comments