Theory HelloWorld
theory HelloWorld
  imports IO
begin
section‹Hello, World!›
text‹
  The idea of a \<^term>‹main :: unit io› function is that, upon start of your program, you will be
  handed a value of type \<^typ>‹🌐›. You can pass this world through your code and modify it.
  Be careful with the \<^typ>‹🌐›, it's the only one we have.
›
text‹The main function, defined in Isabelle. It should have the right type in Haskell.›
definition main :: "unit io" where
  "main ≡ do {
               _ ← println (STR ''Hello World! What is your name?'');
               name ← getLine;
               println (STR ''Hello, '' + name + STR ''!'')
             }"
section‹Generating Code›
text‹Checking that the generated code compiles.›
export_code main checking Haskell? SML
setup ‹
let
  val parser =
    Scan.repeat (Args.const {proper = true, strict = true}) --
      Scan.lift (\<^keyword>‹in› |-- Parse.name -- (\<^keyword>‹module_name› |-- Parse.name))
  fun action ctxt (consts, (target, module)) =
    Code_Target.produce_code ctxt false consts target module NONE []
    |> fst
    |> map (Bytes.content o snd) |> String.concatWith "\n"
in
  Document_Output.antiquotation_verbatim @{binding code} parser action
end›
subsection‹Haskell›
text‹The generated code in Haskell (including the prelude) is shown below.›
text_raw‹@{code main in Haskell module_name HelloWorld}›
subsection‹SML›
text‹The generated code in SML (including the prelude) is shown below.›
text_raw‹@{code main in SML module_name HelloWorld}›
end