带有呼叫者信息的跟踪的简短语法

Short syntax for trace with caller info

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

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

Tracer().DoTrace "foo"

我正在寻找

trace "foo"

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

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

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

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

Opening a type 公开了该类型的所有可访问静态成员,所以我认为这可以满足您的要求:

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

输出为:

Message: foo
Member name: main
Source file path: ...\Program.fs
Source line number: 18

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

[<AutoOpen>]
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}"

[<EntryPoint>]
let main _ =
    trace "foo"
    0