185 datatype function_opt |
182 datatype function_opt |
186 = Sequential |
183 = Sequential |
187 | Default of string |
184 | Default of string |
188 | DomIntros |
185 | DomIntros |
189 | No_Partials |
186 | No_Partials |
190 | Tailrec |
|
191 |
187 |
192 datatype function_config = FunctionConfig of |
188 datatype function_config = FunctionConfig of |
193 {sequential: bool, |
189 {sequential: bool, |
194 default: string option, |
190 default: string option, |
195 domintros: bool, |
191 domintros: bool, |
196 partials: bool, |
192 partials: bool} |
197 tailrec: bool} |
193 |
198 |
194 fun apply_opt Sequential (FunctionConfig {sequential, default, domintros, partials}) = |
199 fun apply_opt Sequential (FunctionConfig {sequential, default, domintros, partials, tailrec}) = |
195 FunctionConfig {sequential=true, default=default, domintros=domintros, partials=partials} |
200 FunctionConfig {sequential=true, default=default, domintros=domintros, partials=partials, tailrec=tailrec} |
196 | apply_opt (Default d) (FunctionConfig {sequential, default, domintros, partials}) = |
201 | apply_opt (Default d) (FunctionConfig {sequential, default, domintros, partials, tailrec}) = |
197 FunctionConfig {sequential=sequential, default=SOME d, domintros=domintros, partials=partials} |
202 FunctionConfig {sequential=sequential, default=SOME d, domintros=domintros, partials=partials, tailrec=tailrec} |
198 | apply_opt DomIntros (FunctionConfig {sequential, default, domintros, partials}) = |
203 | apply_opt DomIntros (FunctionConfig {sequential, default, domintros, partials, tailrec}) = |
199 FunctionConfig {sequential=sequential, default=default, domintros=true, partials=partials} |
204 FunctionConfig {sequential=sequential, default=default, domintros=true, partials=partials, tailrec=tailrec} |
200 | apply_opt No_Partials (FunctionConfig {sequential, default, domintros, partials}) = |
205 | apply_opt Tailrec (FunctionConfig {sequential, default, domintros, partials, tailrec}) = |
201 FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=false} |
206 FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=partials, tailrec=true} |
|
207 | apply_opt No_Partials (FunctionConfig {sequential, default, domintros, partials, tailrec}) = |
|
208 FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=false, tailrec=true} |
|
209 |
202 |
210 val default_config = |
203 val default_config = |
211 FunctionConfig { sequential=false, default=NONE, |
204 FunctionConfig { sequential=false, default=NONE, |
212 domintros=false, partials=true, tailrec=false } |
205 domintros=false, partials=true} |
213 |
206 |
214 |
207 |
215 (* Analyzing function equations *) |
208 (* Analyzing function equations *) |
216 |
209 |
217 fun split_def ctxt check_head geq = |
210 fun split_def ctxt check_head geq = |
342 local |
335 local |
343 val option_parser = Parse.group "option" |
336 val option_parser = Parse.group "option" |
344 ((Parse.reserved "sequential" >> K Sequential) |
337 ((Parse.reserved "sequential" >> K Sequential) |
345 || ((Parse.reserved "default" |-- Parse.term) >> Default) |
338 || ((Parse.reserved "default" |-- Parse.term) >> Default) |
346 || (Parse.reserved "domintros" >> K DomIntros) |
339 || (Parse.reserved "domintros" >> K DomIntros) |
347 || (Parse.reserved "no_partials" >> K No_Partials) |
340 || (Parse.reserved "no_partials" >> K No_Partials)) |
348 || (Parse.reserved "tailrec" >> K Tailrec)) |
|
349 |
341 |
350 fun config_parser default = |
342 fun config_parser default = |
351 (Scan.optional (Parse.$$$ "(" |-- Parse.!!! (Parse.list1 option_parser) --| Parse.$$$ ")") []) |
343 (Scan.optional (Parse.$$$ "(" |-- Parse.!!! (Parse.list1 option_parser) --| Parse.$$$ ")") []) |
352 >> (fn opts => fold apply_opt opts default) |
344 >> (fn opts => fold apply_opt opts default) |
353 in |
345 in |