带有调用者信息的跟踪的简短语法

rwa*_*ace 5 debugging f# attributes

我正在寻找一种在 F# 中打印值以及源文件和行号的方法;它用于半交互式调试,因此语法需要简短。

https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/caller-information提供了部分解决方案。该页面上的代码可以这样调用:

Tracer().DoTrace "foo"
Run Code Online (Sandbox Code Playgroud)

我正在寻找

trace "foo"
Run Code Online (Sandbox Code Playgroud)

但是,当然,trace将上述内容包装在函数中将报告trace始终是调用者,这违背了目的。

我尝试过let inline trace ...,但这没有任何区别。

如果 F# 有这样的宏,我会尝试使用宏,但它没有。

通过修改上述链接代码或其他方式,trace以尽可能短的调用者语法获取功能的最佳方法是什么?

bri*_*rns 8

打开类型会公开该类型的所有可访问静态成员,因此我认为这可以满足您的需求:

open System.Runtime.CompilerServices
open System.Runtime.InteropServices

type Tracer() =
    static member trace(message: string,
                [<CallerMemberName; Optional; DefaultParameterValue("")>] memberName: string,
                [<CallerFilePath; Optional; DefaultParameterValue("")>] path: string,
                [<CallerLineNumber; Optional; DefaultParameterValue(0)>] line: int) =
        printfn $"Message: {message}"
        printfn $"Member name: {memberName}"
        printfn $"Source file path: {path}"
        printfn $"Source line number: {line}"

open type Tracer

[<EntryPoint>]
let main _ =
    trace "foo"
    0
Run Code Online (Sandbox Code Playgroud)

输出是:

Message: foo
Member name: main
Source file path: ...\Program.fs
Source line number: 18
Run Code Online (Sandbox Code Playgroud)

或者,如果需要,您可以自动打开该类型,因此调用者不必显式打开它:

Message: foo
Member name: main
Source file path: ...\Program.fs
Source line number: 18
Run Code Online (Sandbox Code Playgroud)