如何获取函数名称作为符号?

Flu*_*lux 2 scheme racket

我正在尝试定义一个函数func->symbol,该函数接受一个函数并将其名称作为符号返回。例如:

(define (pythagoras a b)
  (sqrt (+ (* a a) (* b b))))

;; #1
(func->symbol pythagoras)  ; Returns: 'pythagoras

;; #2
(func->symbol (if #t pythagoras sqrt))  ; Returns: 'pythagoras

;; #3
(let ((f (if #t pythagoras sqrt)))
  (func->symbol f))  ; Returns: 'pythagoras

;; #4
(let ((f (if #t pythagoras sqrt)))
  (let ((g f))
    (func->symbol g)))  ; Returns: 'pythagoras
Run Code Online (Sandbox Code Playgroud)

这是关于如何获取定义名称作为符号的后续问题?它只处理情况#1。对于情况#1,一个简单的宏def->symbol就足够了:

(define-syntax def->symbol
  (syntax-rules ()
    ((_ def) 'def)))
Run Code Online (Sandbox Code Playgroud)

然而,这个宏定义不通过情况#2、#3、#4。是否可以定义func->symbol,或者 Scheme 对此表达能力不够?

Rya*_*per 5

在 Racket 中,在很多情况下,您可以使用 来获取函数的名称object-name。但依赖此结果进行除调试之外的任何操作可能是个坏主意。