gpt4 book ai didi

Racket:你如何使用参数的值作为符号?

转载 作者:行者123 更新时间:2023-12-04 10:48:47 25 4
gpt4 key购买 nike

我是 Racket 的新手,正在努力寻找合适的词来解释我正在尝试做的事情。我能想到的最好的方法是:如何使用 值(value) 将参数作为符号,不调用与参数值同名的函数,并且不只是引用 姓名 的论点?

这是一个显示这一点的最小示例。

有一个函数叫做 ul做某事。

还有一个函数叫做 make-list它有一个参数,list-type .

还有第三个函数,make-ul , 调用 make-list带参数 ul .

在真正的分支中,函数 ul被申请;被应用。目前很好。

在 false 分支中,我希望能够使用参数的值,在本例中为 'ul , 作为一个符号。实际上,这行代码将运行 (λ args (list* 'ul args)) .我如何实现这一目标?

#lang racket

(define (ul . xs) `(div ,@xs))

(define (make-list list-type)
(if (equal? 'something 'something-else)
(λ args (apply list-type args)) ; true branch: call the function "ul"
(λ args (list* list-type args)))) ; false branch: how to use `ul without calling the "ul" function?

(define make-ul (make-list ul))

最佳答案

如果您的目标是编写好的 Racket 代码,那么最好的答案是不要。
添加一个单独的参数来获取符号,如下所示:

;; make-list : Procedure Symbol -> Any ... -> Any
(define (make-list proc tag-sym)
(if ....
proc ;; (λ args (apply proc args)) simplifies to just proc
(λ args (list* tag-sym args))))

(define make-ul (make-list ul 'ul))

或者如果分支独立于 args , 你可以只有一个 (U Procedure Symbol) 类型的参数反而:
;; make-list : (U Procedure Symbol) -> Any ... -> Any
(define (make-list list-type)
(cond [(procedure? list-type)
;; (λ args (apply list-type args))
list-type]
[(symbol? list-type)
(λ args (list* list-type args))]))

(define make-ul (make-list ul))
(define make-li (make-list 'li))

如果您想探索 Racket 的功能,主要有两种方法。
  • 您可以制作一个宏,它采用过程名称并将其用作引用并将其作为符号引用。例如,使用 make-list 的第一个版本多于:
    (define-syntax-rule (make-list* proc-name) (make-list proc-name (quote proc-name)))

    (define make-ul (make-list* ul)) ;; => (define make-ul (make-list ul 'ul))
  • 您可以调用object-name在一个程序上询问 Racket 认为它的名字是什么。例如,(object-name list)返回 'list , 和 (object-name ul)应该返回 'ul .但是(object-name make-ul)不会返回 'make-ul ,因为 Racket 在编译时跟踪名称,而不是在运行时。 (我建议不要编写依赖于 object-name 的代码;这会使您的代码非常脆弱。)
  • 关于Racket:你如何使用参数的值作为符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59580144/

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