首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为`[<EntryPoint>]‘调用` `argv`’中定义的特定函数,或动态命名要调用的函数

为`[<EntryPoint>]‘调用` `argv`’中定义的特定函数,或动态命名要调用的函数
EN

Stack Overflow用户
提问于 2020-12-08 21:05:13
回答 1查看 46关注 0票数 1

是否可以以某种方式定义在F#中动态打开的函数名和/或模块名?

在网上搜索似乎表明,只有当“名字”是一种类型的成员时,才有可能使用内省。

我之所以问这个问题,是因为我对“守则”的出现's [<EntryPoint>]的解决方案开始显得非常乏味,而且绝对不是干的。

我所有的“解谜”功能都是在Day -specific模块中定义的,并且具有相同的签名String -> Unit -> int64,即它们以一个文件名作为输入(为了测试的缘故,因为大多数(如果不是所有的话)谜题都有测试向量)和单元(这样它们就不会在模式匹配时都执行)

代码语言:javascript
复制
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,我是不是做错了什么,还有更好的方法来实现同样的目标?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 21:19:59

更一般说来,我可能不会为代码的降临创建一个复杂的启动程序--对于我做过的几个谜题,我只是将每个谜题的代码保存在一个脚本文件中,然后通过选择所有代码并在F#互动中运行它来运行它--而不是有一个命令行界面。

但是,如果您更喜欢命令行接口,那么您应该能够使用反射来做您想做的事情。每个F#模块都编译成一个类,您可以使用Assembly.GetExecutingAssembly().GetTypes()获取所有加载类的列表,查找所需的类,并调用它具有的方法(如run )。

例如:

代码语言:javascript
复制
module Day1 = 
  let run () = printfn "day 1"

module Day2 = 
  let run () = printfn "day 2"

module Day2b = 
  let run () = printfn "day 2b"

采用模块名并运行其run函数的(非常基本的)函数如下所示:

代码语言:javascript
复制
open System.Reflection

let run name = 
  let typ = 
    Assembly.GetExecutingAssembly().GetTypes()
    |> Seq.find (fun t -> t.Name = name)
  typ.GetMethod("run").Invoke(null, [||]) |> ignore

要测试这一点:

代码语言:javascript
复制
run "Day1"
run "Day2"
run "Day2b"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65206892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档