使用列表中的名称调用计划函数

发布于 2024-11-28 07:28:58 字数 231 浏览 4 评论 0原文

是否可以仅使用可用的函数名称(例如列表中的字符串)来调用计划函数?

示例

(define (somefunc x y)
  (+ (* 2 (expt x 2)) (* 3 y) 1))

(define func-names (list "somefunc"))

然后使用 (car func-names) 调用 somefunc。

Is it possible to call a Scheme function using only the function name that is available say as a string in a list?

Example

(define (somefunc x y)
  (+ (* 2 (expt x 2)) (* 3 y) 1))

(define func-names (list "somefunc"))

And then call the somefunc with (car func-names).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叫嚣ゝ 2024-12-05 07:28:58

在许多Scheme 实现中,您可以使用eval 函数:

((eval (string->symbol (car func-names))) arg1 arg2 ...)

但是,您通常并不真正想这样做。如果可能,将函数本身放入列表中并调用它们:

(define funcs (list somefunc ...))
;; Then:
((car funcs) arg1 arg2 ...)

附录

正如评论者所指出的,如果您确实想要将字符串映射到函数,则需要手动执行此操作。由于函数与其他对象一样都是对象,因此您可以简单地为此目的构建一个字典,例如关联列表或哈希表。例如:

(define (f1 x y)
  (+ (* 2 (expt x 2)) (* 3 y) 1))
(define (f2 x y)
  (+ (* x y) 1))

(define named-functions
  (list (cons "one"   f1)
        (cons "two"   f2)
        (cons "three" (lambda (x y) (/ (f1 x y) (f2 x y))))
        (cons "plus"  +)))

(define (name->function name)
  (let ((p (assoc name named-functions)))
    (if p
        (cdr p)
        (error "Function not found"))))

;; Use it like this:
((name->function "three") 4 5)

In many Scheme implementations, you can use the eval function:

((eval (string->symbol (car func-names))) arg1 arg2 ...)

You generally don't really want to do that, however. If possible, put the functions themselves into the list and call them:

(define funcs (list somefunc ...))
;; Then:
((car funcs) arg1 arg2 ...)

Addendum

As the commenters have pointed out, if you actually want to map strings to functions, you need to do that manually. Since a function is an object like any other, you can simply build a dictionary for this purpose, such as an association list or a hash table. For example:

(define (f1 x y)
  (+ (* 2 (expt x 2)) (* 3 y) 1))
(define (f2 x y)
  (+ (* x y) 1))

(define named-functions
  (list (cons "one"   f1)
        (cons "two"   f2)
        (cons "three" (lambda (x y) (/ (f1 x y) (f2 x y))))
        (cons "plus"  +)))

(define (name->function name)
  (let ((p (assoc name named-functions)))
    (if p
        (cdr p)
        (error "Function not found"))))

;; Use it like this:
((name->function "three") 4 5)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文