[isabelle-dev] Code generation to OCaml and Scala
Frédéric Tuong
frederic.tuong at lri.fr
Tue Sep 1 17:37:44 CEST 2015
Dear all,
The following is a list with 2 elements:
definition "l = [let x = True in x, False]"
However after doing "export_code l in OCaml", we obtain a list with only
1 element, because at the end no parentheses are inserted around the
corresponding "let".
In particular by default in OCaml [let x = true in x ; false] is
understood as [let x = true in (x ; false)]
and then a warning can be raised whenever x does not have type unit.
By comparing the generating code for SML and OCaml in
src/Tools/Code/code_ml.ML, I would be tempted to replace
"brackify_block" by "brackets" everytime in the corresponding
"print_case" clause, and skip this optimization like in the SML part
where "let"..."in"..."end" are inserted everytime, what about you?
In the same spirit, the following code does not compile after exporting
to Scala:
datatype n = N nat
definition "b = (let _ = N in False)"
This is because N is a function, and no parentheses are generated around
functions (at least in this example).
Whereas this behavior can be very useful for detecting ghost functions
in a large project (the detection may also not be complete), it does not
mean that errors only occur with ghost code.
For example, the following code is well-typed in Isabelle but not in Scala:
definition "f l = (%x. x | True) # (%x. x | False) # l"
Cheers,
Frédéric
More information about the isabelle-dev
mailing list