@@ -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[:main_body ] = generate_mainbody (modelinfo[:main_body ], modelinfo[:args ])
72
+ modelinfo[:main_body ] = generate_mainbody (modelinfo[:main_body ], modelinfo[:args ], warn )
70
73
71
74
return build_output (modelinfo)
72
75
end
@@ -162,50 +165,53 @@ function build_model_info(input_expr)
162
165
end
163
166
164
167
"""
165
- generate_mainbody(expr, args)
168
+ generate_mainbody(expr, args, warn )
166
169
167
170
Generate the body of the main evaluation function from expression `expr` and arguments
168
171
`args`.
172
+
173
+ If `warn` is true, a warning is displayed if internal variables are used in the model
174
+ definition.
169
175
"""
170
- generate_mainbody (expr, args) = generate_mainbody! (Symbol[], expr, args)
176
+ generate_mainbody (expr, args, warn ) = generate_mainbody! (Symbol[], expr, args, warn )
171
177
172
- generate_mainbody! (found, x, args) = x
173
- function generate_mainbody! (found, sym:: Symbol , args)
174
- if sym in INTERNALNAMES && sym ∉ found
178
+ generate_mainbody! (found, x, args, warn ) = x
179
+ function generate_mainbody! (found, sym:: Symbol , args, warn )
180
+ if warn && sym in INTERNALNAMES && sym ∉ found
175
181
@warn " you are using the internal variable `$(sym) `"
176
182
push! (found, sym)
177
183
end
178
184
return sym
179
185
end
180
- function generate_mainbody! (found, expr:: Expr , args)
186
+ function generate_mainbody! (found, expr:: Expr , args, warn )
181
187
# Do not touch interpolated expressions
182
188
expr. head === :$ && return expr. args[1 ]
183
189
184
190
# Apply the `@.` macro first.
185
191
if Meta. isexpr (expr, :macrocall ) && length (expr. args) > 1 &&
186
192
expr. args[1 ] === Symbol (" @__dot__" )
187
- return generate_mainbody! (found, Base. Broadcast. __dot__ (expr. args[end ]), args)
193
+ return generate_mainbody! (found, Base. Broadcast. __dot__ (expr. args[end ]), args, warn )
188
194
end
189
195
190
196
# Modify dotted tilde operators.
191
197
args_dottilde = getargs_dottilde (expr)
192
198
if args_dottilde != = nothing
193
199
L, R = args_dottilde
194
- return Base . remove_linenums! ( generate_dot_tilde (generate_mainbody! (found, L, args),
195
- generate_mainbody! (found, R, args),
196
- args))
200
+ return generate_dot_tilde (generate_mainbody! (found, L, args, warn ),
201
+ generate_mainbody! (found, R, args, warn ),
202
+ args) |> Base . remove_linenums!
197
203
end
198
204
199
205
# Modify tilde operators.
200
206
args_tilde = getargs_tilde (expr)
201
207
if args_tilde != = nothing
202
208
L, R = args_tilde
203
- return Base . remove_linenums! ( generate_tilde (generate_mainbody! (found, L, args),
204
- generate_mainbody! (found, R, args),
205
- args))
209
+ return generate_tilde (generate_mainbody! (found, L, args, warn ),
210
+ generate_mainbody! (found, R, args, warn ),
211
+ args) |> Base . remove_linenums!
206
212
end
207
213
208
- return Expr (expr. head, map (x -> generate_mainbody! (found, x, args), expr. args)... )
214
+ return Expr (expr. head, map (x -> generate_mainbody! (found, x, args, warn ), expr. args)... )
209
215
end
210
216
211
217
0 commit comments