带有呼叫者信息的跟踪的简短语法
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
我正在寻找一种在 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