So, I got a response on StackOverflow from the creator of IronScheme on how to combine enums. It was very nice of him, IronScheme is obviously a labor of love for him. Just as I wrote a conversion of the “hello world” program generator in F#, I now present it in IronScheme with no attempt to reduce the verbosity.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
(import (rnrs) (ironscheme) (ironscheme clr)) (clr-using System) (clr-using System.Reflection.Emit) (clr-using System.Reflection) (clr-using System.Threading) (define (emit-hello-world) (let ((assembly-name (clr-new AssemblyName))) (clr-prop-set! AssemblyName Name assembly-name "HelloWorld") (let* ((thread-domain (clr-static-call Thread GetDomain)) (assembly-builder (clr-call AppDomain DefineDynamicAssembly thread-domain assembly-name (clr-static-field-get AssemblyBuilderAccess RunAndSave))) (module (clr-call AssemblyBuilder DefineDynamicModule assembly-builder "HelloWorld.exe")) (type-builder (clr-call ModuleBuilder DefineType module "HelloWorldType" '(public class))) (method-builder (clr-call TypeBuilder DefineMethod type-builder "Main" '(hidebysig static public) (get-clr-type 'System.Void) (vector (get-clr-type 'System.String)))) (ilgenerator (clr-call MethodBuilder GetILGenerator method-builder))) (clr-call ILGenerator EmitWriteLine ilgenerator "Hello World") (clr-call ILGenerator Emit ilgenerator (clr-static-field-get OpCodes Ret)) (let ((new-type (clr-call TypeBuilder CreateType type-builder))) (clr-call AssemblyBuilder SetEntryPoint assembly-builder method-builder (clr-static-field-get PEFileKinds ConsoleApplication)) (clr-call AssemblyBuilder Save assembly-builder "HelloWorld.exe") (display "done") (newline))))) (emit-hello-world) |