gpt4 book ai didi

F# 交互式 - 如何查看当前 session 中定义的所有变量

转载 作者:行者123 更新时间:2023-12-03 23:46:49 26 4
gpt4 key购买 nike

在 F# 交互式中,如何查看此 session 中定义的变量/函数列表?像函数whos()在 python 中或 ls()在R?谢谢。

最佳答案

您可能可以使用 .NET 反射来实现这一点 - 局部变量和函数被定义为单个动态程序集中的静态属性/类型方法。您可以通过调用 GetExecutingAssembly 来获取该程序集。 (在 FSI 本身中)然后浏览类型以找到所有合适的属性。

以下是获取局部变量的合理工作函数:

open System.Reflection
open System.Collections.Generic

let getVariables() =
let types = Assembly.GetExecutingAssembly().GetTypes()
[ for t in types |> Seq.sortBy (fun t -> t.Name) do
if t.Name.StartsWith("FSI_") then
let flags = BindingFlags.Static ||| BindingFlags.NonPublic |||
BindingFlags.Public
for m in t.GetProperties(flags) do
yield m.Name, lazy m.GetValue(null, [||]) ] |> dict

下面是一个例子:
> let test1 = "Hello world";;
val test1 : string = "Hello world"

> let test2 = 42;;
val test2 : int = 42

> let vars = getVariables();;
val vars : System.Collections.Generic.IDictionary<string,Lazy<obj>>

> vars.["test1"].Value;;
val it : obj = "Hello world"

> vars.["test2"].Value;;
val it : obj = 42

该函数返回“惰性”值(因为这是最简单的编写方法,无需提前读取所有变量的值,这会很慢),因此您需要使用 Value属性(property)。另请注意,您会收到 object返回 - 因为 F# 类型系统无法知道类型 - 您必须动态使用它。您只需遍历 vars 即可获得所有名称...

关于F# 交互式 - 如何查看当前 session 中定义的所有变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4997028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com