为什么函数 apply 会抱怨长列表?

2024-01-22

作为一些欧拉阵痛 http://projecteuler.net,我正在尝试编写一个埃拉托斯特尼筛法 https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes带有因式分解轮。到目前为止我的代码是:

(defun ring (&rest content)
"Returns a circular list containing the elements in content.
 The returned list starts with the first element of content."
   (setf (cdr (last content)) content))

(defun factorization-wheel (lst)
"Returns a circular list containing a factorization 
 wheel using the list of prime numbers in lst"
   (let ((circumference (apply #'* lst)))
     (loop for i from 1 to circumference
           unless (some #'(lambda (x) (zerop (mod i x))) lst)
             collect i into wheel
           finally (return (apply #'ring 
                             (maplist 
                                 #'(lambda (x) ; Takes exception to long lists (?!)
                                     (if (cdr x)
                                         (- (cadr x) (car x))
                                         (- circumference (car x) -1)))
                                 wheel))))))

(defun eratosthenes (n &optional (wheel (ring 4 2)))
"Returns primes up to n calculated using
 a Sieve of Eratosthenes and a factorization wheel"
   (let* ((candidates (loop with s = 1
                            for i in wheel
                            collect (setf s (+ i s))
                            until (> s n))))
       (maplist #'(lambda (x) 
                    (if (> (expt (car x) 2) n)     
                        (return-from eratosthenes candidates))
                    (delete-if 
                        #'(lambda (y) (zerop (mod y (car x)))) 
                        (cdr x))) 
                candidates)))

对于长度超过 6 个元件的轮子,我得到以下结果。我真的不明白为什么:

21 > (factorization-wheel '(2 3 5 7 11 13))
(16 2 4 6 2 6 4 2 4 6 6 2 6 4 2 6 4 6 8 4 ...)
21 > (factorization-wheel '(2 3 5 7 11 13 17))
> Error: Too many arguments.
> While executing: FACTORIZATION-WHEEL, in process listener(1).

该算法似乎工作正常,否则会产生带有 6 个或更少元素的轮子的素数。

显然apply or ring当长长的名单递给他们时,他们会嗤之以鼻。

但是这个列表不应该算作一个参数吗?我承认我彻底困惑了。任何意见都会受到赞赏。


ANSI Common Lisp 允许实现限制可传递给函数的参数的最大数量。该限制由下式给出调用参数限制 http://clhs.lisp.se/Body/v_call_a.htm可以小至 50。

对于行为类似于代数群运算符的函数,遵循 关联属性(+, list等),我们可以通过使用来绕过限制reduce在将函数视为二进制时抽取输入列表。

例如添加一个大的数字列表:(reduce #'+ list)而不是(apply #'+ list).

注意事项reduce

在 Common Lisp 中,reduce即使列表为空也似乎可以工作。很少有其他语言可以给你这个,而且它实际上并不是来自reduce:它不适用于所有功能。但与+我们可以写(reduce #'+ nil)它计算为零,就像(apply #'+ nil).

这是为什么?因为+函数可以使用零参数调用,并且当使用零参数调用时,它会生成加法群的单位元:0。这与reduce功能。

在其他一些语言中fold or reduce函数必须被赋予一个初始种子值(例如0),否则是一个非空列表。如果两者都没有给出,那就是一个错误。

通用 Lispreduce,如果给出一个空列表并且没有:initial-value,将不带参数调用内核函数,并使用返回值作为初始值。由于该值是唯一的值(列表为空),因此返回该值。

请注意最左侧参数具有特殊规则的函数。例如:

(apply #'- '(1)) -> -1  ;; same as (- 1), unary minus semantics.

(reduce #'- '(1)) -> 1  ;; what?

发生的事情是当reduce给定一个单元素列表,它只返回元素而不调用函数。

基本上它是建立在上面提到的数学假设之上的,如果没有:initial-value然后提供f预计会支持(f) -> i, where i是一些与相关的单位元f, 以便(f i x) -> x。这在减少单例列表时用作初始值,(reduce #'f (list x)) -> (f (f) x) -> (f i x) -> x.

The -函数不遵守这些规则。(- a 0)意思是“从a” 所以产量a, 然而(- a)是加法逆元a,可能纯粹出于实用的、符号的原因(即,不让 Lisp 程序员编写(- 0 a)只是为了翻转一个标志,只是为了拥有-在以下情况下表现得更加一致reduce and apply). The -函数也不能用零参数调用。

如果我们想获取一个数字列表并将它们全部从某个值中减去x,其模式是:

(reduce #'- list-of-numbers :initial-value x)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么函数 apply 会抱怨长列表? 的相关文章

  • 如何理解clojure的lazy-seq

    我正在尝试理解 Clojurelazy seq运算符 以及惰性求值的一般概念 我知道这个概念背后的基本思想 表达式的求值被延迟 直到需要该值为止 一般来说 这可以通过两种方式实现 在编译时使用宏或特殊形式 在运行时使用 lambda 函数
  • Common Lisp 中重置状态

    新手 Common Lisp 问题在这里 有没有办法重置环境状态 我的意思是 是否有一些命令可以使 REPL 恢复到启动后的相同状态 即取消所有变量 函数等 或者如果这不在 Common Lisp 标准中 是否有一些扩展在 SBCL 我使用
  • 将多项回答问题制成表格

    想象一下 我有一个问题 有四个选项 受访者可以选择零个或四个选项的任意组合 变量被命名为A B C and D响应存储在 data frame 中 如下所示 set seed 1 dat data frame A sample c 0 1
  • python pandas:将带有参数的函数应用于一系列

    我想将带有参数的函数应用于 python pandas 中的一系列 x my series apply my function more arguments 1 y my series apply my function more argu
  • elisp:有没有办法获取当前 .el 模块的名称(如 C 中的 __FILE__ )?

    在我的 elisp 模块的顶部 我想做一些简单的事情 message concat Loading expand file name current elisp module 您可以使用变量load file name https www
  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • 我应该在 Common Lisp 中使用哪些正则表达式库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • LISP 中的变量和符号有什么区别?

    从范围上来说 内存中的实际实现 语法 例如 if let a 1 a 是变量还是符号 约尔格的回答指出了正确的方向 让我补充一点 我将讨论与 Common Lisp 类似的 Lisp 作为数据结构的符号 符号是 Lisp 中真实的数据结构
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 对于案例,这些表达案例的方法中哪种最好?

    这些都有效 defun testcaseexpr thecase case thecase foo format t matched foo bar format t matched bar funk format t matched fu
  • 有没有一种简单的方法可以使用 Common Lisp 中的 Python 库?

    在编写 Common Lisp 代码时我真正怀念的一件事是访问 Python 库 包括标准库和第三方模块 CLPython 提供了 Python 功能的有限子集 这阻止了大多数库的使用 因此这对我来说并不是很有用 我希望能够从 Common
  • 在Emacs中,这个错误是什么意思? “警告:运行时需要 cl 包”

    我正在字节编译一个模块 它给了我这个警告 Warning cl package required at runtime 为什么这是一个警告 我很清楚我正在使用cl包裹 事实上有一个 require cl 模块中的语句 使用有什么问题吗cl
  • 如何按会计季度分组的日期计算平均值

    我有下表 Date Country Class Value 6 1 2010 USA A 45 6 1 2010 Canada A 23 6 1 2010 Brazil B 65 9 1 2010 USA B 47 9 1 2010 Can
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看

随机推荐

  • 在Python中,可以在不使用继承的情况下实现mixin行为吗?

    Python 中是否有一种合理的方法来实现类似于 Ruby 中的 mixin 行为 即不使用继承 class Mixin object def b self print b def c self print c class Foo obje
  • JavaPlot 和 gnuplot

    我正在拼命地努力让 Java 和 gnuplot 更好地发挥作用 我已经开始使用JavaPlot并将 jar 添加到类路径 使用 Eclipse 我还下载了 gnuplot 并将其放在安全的地方 第一个问题 所有例子都由JavaPlot假设
  • boost::filesystem::directory_iterator 是否因删除而失效?

    我正在遍历一个目录 当某个项目符合某些条件时 我将其删除 我可以在循环内安全地执行此操作 还是必须将路径保存在数组中并稍后删除 我没有找到相关信息boost 文件系统文档 http www boost org doc libs 1 52 0
  • PDFBox IOException:文件结尾,预期行

    我目前正在尝试使用 PDFBox 和 Selenium 从已上传并通过链接访问的 PDF 中获取文本 我用这个作为来源 http www seleniumeasy com selenium tutorials how to extract
  • 如何在 Firefox DevTools 中编辑或删除 cookie?

    在 Firebug 中 我可以使用以下命令删除和编辑任何 cookieCookies panel 但在 Firefox DevTools 中我找不到任何删除或编辑 cookie 的方法 我可以在哪里做到这一点 要在 Firefox DevT
  • bash“read -a”在空分隔字符串变量上循环

    我一直在阅读这篇文章 bash for in 在空分隔字符串变量上循环 https stackoverflow com questions 8677546 bash for in looping on null delimited stri
  • 单元测试cherpy web应用程序

    我最近不得不重写我们的 REST API 并从 Flask 切换到 Cherrypy 主要是由于 Python 3 兼容性 但现在我一直在尝试编写单元测试 Flask 有一个非常漂亮的内置测试客户端 您可以使用它向您的应用程序发送虚假请求
  • 未将对象引用设置为对象的实例 #5

    sUsername Trim sPassword Trim string ConnectionString WebConfigurationManager ConnectionStrings dbnameConnectionString C
  • 如何编写Delphi编译时函数

    Delphi 我可以自己写吗compile time functions对于 const 和 var 声明 在编译时可执行 标准 Delphi 库包含 Ord Chr Trunc Round High 等例程 用于常量初始化 我可以编写自己
  • 如何获取 Android 应用程序的 Google Places API 密钥

    在过去的 48 小时里 我绞尽脑汁试图找到这个问题的答案 问这个问题的人 如何为 Google Places api 制作 API KEY https stackoverflow com questions 23128152 how can
  • 通知的 PendingIntent 不要第二次调用我的活动

    我希望接收推送通知 c2dm 接收显示Notification 此通知以 PendingIntent 启动 这是一个显示弹出窗口的活动 单击 确定 按钮时 此弹出窗口将启动我的应用程序 这是在接收推送通知时执行的代码 private voi
  • Groovy list.sort 按第一个、第二个然后第三个元素

    我有一个很棒的列表 即 list 2 0 1 1 5 2 1 0 3 我想按第一个元素的顺序对其进行排序 然后是第二个元素 然后是第三个元素 Expected assert list 1 0 3 1 5 2 2 0 1 我开始于list l
  • gem 安装 memcached 失败

    关于做 gem install memcached 抛出以下错误 checking for pod2man usr bin pod2man configure line 22468 syntax error near unexpected
  • 转向 SVG 图标 - 如何将它们与代码分开?

    与字体图标相比 SVG 图标具有一些优势 它们可以缩放以适应可变大小的容器元素 并且理论上您可以更改各个路径的颜色 我还喜欢这样一个事实 我可以轻松地在 Inkscape 中制作它们 P 但是 如何在 CSS 文件中移动 SVG 以便可以在
  • 防止 go build 覆盖 go.mod 中的版本

    我有一个导入项目 foo 的 go 模块 foo 的最新标签显示 v1 4 当我做一个go build在我的项目中 它更新了 go mod 来表示 module github com myid mymod require github co
  • JasperReports 中的 PAGE_COUNT 未正确呈现...?

    我已经添加了页脚第 x 页 共 y 页 我的报告 但 PAGE COUNT 似乎不起作用 也许出现这个问题是因为我有很多子报表 I get Page 1 of 1 Page 2 of 0 Page 3 of 0 Page 4 of 0 有任
  • MySQL:两个时间戳之间的差异(以秒为单位)?

    是否可以计算MySQL中两个时间戳之间的差异并以秒为单位获得输出结果 Like 2010 11 29 13 16 55 2010 11 29 13 13 55应该给 180 秒 谢谢 我不认为接受的答案是一个好的通用解决方案 这是因为 UN
  • javascript中的尾部函数[重复]

    这个问题在这里已经有答案了 我想创建一个添加参数的函数 调用这个函数应该是 functionAdd 2 3 4 n 结果 2 3 4 n 我正在尝试这个 function myfunction num var summ num if num
  • 如何将代码从旧版本的xcode转移到最新版本?

    我有一个xcode我不久前制作的一个应用程序的项目 但它已经启动xcode 3 2 如何轻松地将项目转移到较新版本的xcode 我尝试手动将项目的每个文件传输到新版本 但不是很成功 有没有更简单 更自动化的方法来做到这一点 编辑 从 xco
  • 为什么函数 apply 会抱怨长列表?

    作为一些欧拉阵痛 http projecteuler net 我正在尝试编写一个埃拉托斯特尼筛法 https en wikipedia org wiki Sieve of Eratosthenes带有因式分解轮 到目前为止我的代码是 def