问题标签 [funcall]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
10879 浏览

lisp - 为什么我们在 Lisp 中需要 funcall?

为什么我们必须使用funcallCommon Lisp 中调用高阶函数?例如,为什么我们必须使用:

而不是更简单的:

来自程序背景,我对此感到有点惊讶,因为我更习惯的语言(例如 Python、C#)不需要区分。特别是,至少在源代码级别,C# 编译器将其转换为类似func.invoke().

我看到的唯一问题是,这意味着我们不能再调用全局函数test-func,因为它会被遮蔽,但这几乎不是问题。

0 投票
2 回答
647 浏览

lisp - Common Lisp,“已定义但从未使用”

此函数编译时出现警告,第一行中定义了fn并且从未使用过,第二行中fn是未定义的函数:

为什么?一般解释或链接会很棒。

PD:完整日志:

0 投票
2 回答
331 浏览

closures - mapcan,尖锐的报价和关闭

我对 CL 有点陌生,目前正试图围绕mapcan,#'funcall闭包。这是一个闭包,它将谓词应用于数字n,如果正确,则返回(list n),否则nil

我知道我需要调用funcall才能将这个闭包变成一个函数。这工作正常:

现在我尝试将特此创建的函数作为参数传递给 mapcan:

我得到一个编译时错误: (FUNCALL (ALL-THOSE #'EVENP)) is not a legal function name

但是,如果我省略#'以及funcall:

现在我很困惑。我的理解是,在使用符号的函数绑定 (*) 时需要对函数进行尖锐引用,并且在“关闭闭包”时mapcan需要调用。 是因为并且正在相互抵消,还是为什么我必须在上面的示例中省略它们?提前感谢您的任何回复。funcall

#'funcall


(*) 我知道在这个例子中我并没有真正可以遵循函数绑定的符号。但是如果我使用匿名函数,mapcan我仍然需要对它进行尖锐引用:(mapcan #'(lambda ...

0 投票
1 回答
41 浏览

recursion - 调试简单的 LISP 函数。

我对 lisp 很陌生,甚至连我的脚都湿透了。我确信有一次,我有一些函数在工作,我将能够在它们的基础上构建并处理更高阶的函数和更复杂的问题。

有人可以在以下代码中指出我的错误。

另外我怎么称呼这个?我有一个我认为可以正常工作的函数,但我无法获得调用它的语法。谢谢你的帮助。

0 投票
1 回答
52 浏览

c - 如何在没有 rb_string_eval 的情况下使用 C API 调用 ObjectSpace.each_object?

我目前正在尝试获取一个类的所有实例,我想用它ObjectSpace.each_object来实现这一点。

这是我在 C 中的实际代码:

但是,我不知道这是否真的是一件好事。我想rb_funcall改用,这可能是一种更清洁的方法。

我的问题是:

  • 比使用更好rb_funcallstring_eval?(我认为是因为解析器)
  • 由于似乎不存在,如何ObjectSpace在 C API 中检索模块?rb_mObjectSpace
0 投票
1 回答
88 浏览

lisp - 比较返回期望值调用函数目录,但在列表上的进程中并非如此

我正在创建一个简单的 elisp 测试器。但是,如下所示,我遇到了错误的行为(我无法理解)。

我认为测试人员应该返回t测试用例(:eq 'a 'a)(:eq (return-symbol) 'a)因为我的测试人员也自然在以下代码之前。实际上并非如此。

下面的代码已经超出了必要的范围,但在大多数情况下,它是在检查明显的行为。

我认为我的测试人员也应该返回那些预期的返回值。

有什么好主意吗?即使解释这种行为的原因也将有助于改进我的测试人员。如果你能给我一些东西,我将不胜感激。

0 投票
4 回答
89 浏览

scheme - 使用 lisp 中的两个命名空间编写测试函数

我开始学习 Lisp 并使用 Lispworks 个人版 6.1.1,在评估基本功能时遇到了问题。我能够在 Scheme 中正确使用它们,但是当我尝试在 Lisp 中评估它们时它们不起作用。

我知道在 Lisp 中每个符号都有两个命名空间。所以我尝试编写简单的程序来组合两个程序。它在 Scheme 中运行良好,但在 Lisp 中存在评估问题。

方案中的代码运行良好并返回 2

用 Lisp 重写的相同代码

lispworks 中的错误是:

试图绑定一个非符号,(FUNCTION CAR).

所以当我尝试(defun test (comp #'car #'cdr))在听众中进行评估时,我得到了

(FUNCTION CAR)在函数中用作变量名的非符号TEST

我不明白为什么它不能像那样写。我会感谢任何帮助

0 投票
3 回答
136 浏览

lisp - 使用 do、if 和 funcall 来定义 (satisfy fun lst),它返回列表中满足函数的项目的列表

我一直在环顾四周,仍然不明白 funcall 是如何工作的。如果有人可以就解决问题的方法给我一个建议,我将不胜感激。我知道“有趣”必须是一个谓词函数,但在那之后我被困住了

顺便说一句,如果在将该项目用作函数的参数时函数返回 true,则该项目满足函数。

0 投票
1 回答
667 浏览

common-lisp - Common Lisp - 如何使用关键字参数调用/应用函数?

语境

  1. 使用像我这样的函数,(lambda (List arg1 arg2 ... argn))我可以使用 funcall/apply使用原始参数调用这些方法,从而修改 lambda 中的列表。
  2. 对于像我这样的函数,(lambda (arg1 arg2 ... argn &key List))我只能将funcall/apply与参数的副本一起使用,这意味着我不能在函数内部修改它们。
  3. 如何使用 2. 中的功能与 1. 中的功能相同?

详细问题

1. 有效的功能

(lambda (mem arg1 arg2 ... argn))

函数可以修改这些列表。

2. 无法修改参数的函数

使用(lambda (arg1 arg2 ... argn &key mem)),我只能使用原始列表的副本来调用它:

因此我不能再修改程序内存。

3. 如何使 2. 中的功能像 1. 中一样工作?

我怎样才能让它工作?即,使用原始列表而不是副本调用函数。


简化旧代码的示例(如 1.):

完整代码可在https://github.com/AlbertoEAF/advent_of_code_2019/blob/master/common-lisp/day5.lisp找到。

0 投票
2 回答
171 浏览

c - C中的嵌套回调函数

我已经编写了一些代码来使用回调调用嵌套函数。但我没有得到预期的输出。

请查看代码:

我也尝试过使用函数指针,但我也得到了与上面相同的输出。