是否可以以某种方式定义在F#中动态打开的函数名和/或模块名?
在网上搜索似乎表明,只有当“名字”是一种类型的成员时,才有可能使用内省。
我之所以问这个问题,是因为我对“守则”的出现's [<EntryPoint>]的解决方案开始显得非常乏味,而且绝对不是干的。
我所有的“解谜”功能都是在Day -specific模块中定义的,并且具有相同的签名String -> Unit -> int64,即它们以一个文件名作为输入(为了测试的缘故,因为大多数(如果不是所有的话)谜题都有测试向量)和单元(这样它们就不会在模式匹配时都执行)
open AoC2020.Utils
open AoC2020.Day1
open AoC2020.Day2
open AoC2020.Day3
open AoC2020.Day4
open AoC2020.Day5
open AoC2020.Day6
open AoC2020.Day7
open AoC2020.Day8
open AoC2020.Day9
[<EntryPoint>]
let main argv =
let day = argv |> getProblem
match day with
| "1" -> day1 "1" ()
| "1b" -> day1part2 "1" ()
| "2" -> day2 "2" ()
| "2b" -> day2part2 "2" ()
| "3" -> day3 "3" ()
| "3b" -> day3part2 "3" ()
| "4" -> day4 "4" ()
| "4b" -> day4part2 "4" ()
| "5" -> day5 "5" ()
| "5b" -> day5part2 "5" ()
| "6" -> day6 "6" ()
| "6b" -> day6part2 "6" ()
| "7" -> day7 "7" ()
| "7b" -> day7part2 "7" ()
| "8" -> day8 "8" ()
| "8b" -> day8part2 "8" ()
| _ -> 1L
|> printfn "%d"
0..or,我是不是做错了什么,还有更好的方法来实现同样的目标?
发布于 2020-12-08 21:19:59
更一般说来,我可能不会为代码的降临创建一个复杂的启动程序--对于我做过的几个谜题,我只是将每个谜题的代码保存在一个脚本文件中,然后通过选择所有代码并在F#互动中运行它来运行它--而不是有一个命令行界面。
但是,如果您更喜欢命令行接口,那么您应该能够使用反射来做您想做的事情。每个F#模块都编译成一个类,您可以使用Assembly.GetExecutingAssembly().GetTypes()获取所有加载类的列表,查找所需的类,并调用它具有的方法(如run )。
例如:
module Day1 =
let run () = printfn "day 1"
module Day2 =
let run () = printfn "day 2"
module Day2b =
let run () = printfn "day 2b"采用模块名并运行其run函数的(非常基本的)函数如下所示:
open System.Reflection
let run name =
let typ =
Assembly.GetExecutingAssembly().GetTypes()
|> Seq.find (fun t -> t.Name = name)
typ.GetMethod("run").Invoke(null, [||]) |> ignore要测试这一点:
run "Day1"
run "Day2"
run "Day2b"https://stackoverflow.com/questions/65206892
复制相似问题