From f2566edeecf58826a48fea95f1fb82d5391ddffa Mon Sep 17 00:00:00 2001 From: "Achim D. Brucker" Date: Thu, 15 Aug 2019 20:48:07 +0100 Subject: [PATCH] Initial commit: SML Code Reflection --- Code_Reflection.thy | 79 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 4 +++ ROOT | 1 + 3 files changed, 84 insertions(+) create mode 100644 Code_Reflection.thy diff --git a/Code_Reflection.thy b/Code_Reflection.thy new file mode 100644 index 0000000..3ac52ef --- /dev/null +++ b/Code_Reflection.thy @@ -0,0 +1,79 @@ +(*********************************************************************************** + * Copyright (c) Achim D. Brucker + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * SPDX-License-Identifier: BSD-2-Clause + * Repository: https://git.logicalhacking.com/adbrucker/isabelle-hacks/ + * Dependencies: None + ***********************************************************************************) + +chapter\Code Reflection for \ +theory + "Code_Reflection" +imports + Main +keywords + "reflect_ML_exports" :: thy_decl +begin + +subsection\Reflecting exported SML code\ +ML\ + fun reflect_local_ML_exports args trans = let + fun eval_ML_context ctxt = let + fun is_sml_file f = String.isSuffix ".ML" (Path.implode (#path f)) + val files = (map (Generated_Files.check_files_in (Context.proof_of ctxt)) args) + val ml_files = filter is_sml_file (map #1 (maps Generated_Files.get_files_in files)) + val ml_content = map (fn f => Syntax.read_input (#content f)) ml_files + fun eval ml_content = fold (fn sml => (ML_Context.exec + (fn () => ML_Context.eval_source ML_Compiler.flags sml))) + ml_content + in + (eval ml_content #> Local_Theory.propagate_ml_env) ctxt + end + in + Toplevel.generic_theory eval_ML_context trans + end + + + val files_in_theory = + (Parse.underscore >> K [] || Scan.repeat1 Parse.path_binding) -- + Scan.option (\<^keyword>\(\ |-- Parse.!!! (\<^keyword>\in\ + |-- Parse.theory_name --| \<^keyword>\)\)); + + val _ = + Outer_Syntax.command \<^command_keyword>\reflect_ML_exports\ + "evaluate generated Standard ML files" + (Parse.and_list1 files_in_theory >> (fn args => reflect_local_ML_exports args)); +\ + +export_code Suc in SML module_name Natural + +reflect_ML_exports _ + +ML\ +open Natural +\ + +end + diff --git a/README.md b/README.md index 1a8e89a..2aa161e 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,10 @@ older versions might be available on a dedicated branch. * [Nano_JSON.thy](Nano_JSON.thy) provides support for a JSON-like data exchange for Isabelle/HOL. +* [Code_Reflection.thy](Code_Reflection.thy) provides a new top-level + command for reflecting generated SML code into Isabelle's ML + environment. + ## Authors Main author: [Achim D. Brucker](http://www.brucker.ch/) diff --git a/ROOT b/ROOT index 84372db..0ef75f4 100644 --- a/ROOT +++ b/ROOT @@ -4,5 +4,6 @@ session "isabelle-hacks" = "HOL" + Assert Hiding_Type_Variables Nano_JSON + Code_Reflection document_files root.tex