天道酬勤,学无止境

common-lisp

Position of All Matching Elements in List

问题 我正在尝试在 Common Lisp 中编写一个类似于内置位置函数的函数,它返回大海捞针中与针匹配的所有元素的位置列表,而不仅仅是第一个。 我提出了一些可能的解决方案(例如,在该位置上使用 cdr-from 函数递归搜索下一个元素并将结果添加到前一个位置),但到目前为止我没有提出任何方法显得特别优雅。 任何人都可以建议解决这个问题的最佳方法,因为我目前正在努力。 回答1 解决问题的明显方法就是依次查看列表中的每个元素,每次比较等于针时,将其位置收集到输出列表中。 在这种情况下,获取位置非常容易,因为我们是从haystack 开始; 我们可以使用一个变量从 0 开始计算当前位置。 因此,如果我们用一句话来描述完整的算法,我们会说“寻找大海捞针的所有位置,对于大海捞针中的每个元素,以及从 0 开始的位置,当元素等于针,收位置。” 当您想要进行迭代处理时,LOOP 工具基本上是正确的选择。 尽管它的语法在形式上描述起来很复杂,但经过一些经验后,您几乎可以将算法的英文描述放在 LOOP 的主体中,它就会起作用。 (defun all-positions (needle haystack) (loop for element in haystack and position from 0 when (eql element needle) collect position)) 回答2

2022-05-17 03:24:14    分类:技术分享    lisp   common-lisp

Lisp web tales: How to fix the blogdemo example (Chapter 4)?

问题 我遇到了 Pavel 关于使用 CL 和 RESTAS 作为框架编写 Web 应用程序的教程。 虽然简单,但Hello, World! 示例工作。 我无法运行第 4 章中的博客示例。 使用(restas:debug-mode-on)我最终得到以下回溯: invalid number of arguments: 0 [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR] Restarts: 0: [ABORT] abort thread (#<THREAD "hunchentoot-worker-127.0.0.1:59876" RUNNING {1009975FD3}>) Backtrace: 0: (BLOGDEMO::HTML-FRAME) [tl,external] 1: (RESTAS::ROUTE-RENDER-METHOD #<RESTAS:ROUTE {100A16FE53}>) 2: ((:METHOD RESTAS:PROCESS-ROUTE (RESTAS:ROUTE T)) #<RESTAS:ROUTE {100A16FE53}> NIL) [fast-method] 3: ((FLET CALL-NEXT-METHOD :IN "C:/Users/martin_b/portacle/quicklisp/dists

2022-05-16 09:27:08    分类:技术分享    common-lisp

Functional programming in LISP

问题 我刚开始学习函数编程,这对我来说有点困惑,我现在有一个任务:从带有列表的行中删除所有重复项,所以:输入行: (SETQ X (LIST 2 -3 (LIST 4 3 0 2) (LIST 4 -4) (LIST 2 (LIST 2 0 2))-3)) 我希望输出是这样的: (2 -3 (4 3 0)(-4)()) 我想用递归来实现。 我有一些概念性问题:如何从列表中删除一个元素,或者我应该为输出创建一个新元素? 在其他编程语言中,递归的每一步都有自己的变量范围,这里是一样的吗? 请问,你能描述一下方法吗,你会怎么做? 顺便说一句,我正在尝试运行此代码: (SETQ X (LIST 2 -3 (LIST 4 3 0 2) (LIST 4 -4) (LIST 2 (LIST 2 0 2))-3))(DEFUN SEARCHDEEP (WHAT WHERE) (COND ((NULL WHERE) NIL) (T (OR (COND ((ATOM (CAR WHERE)) (EQUAL WHAT (CAR WHERE))) (T (SEARCHDEEP WHAT (CAR WHERE))) ) (SEARCHDEEP WHAT (CDR WHERE)) ) ) )) (DEFUN REMDOUBLES (INPUT OUTPUT)( (COND ((NULL INPUT) NILL

2022-05-15 06:32:08    分类:技术分享    common-lisp   clisp

Inferior Shell or UIOP: Interacting with background process

问题 因此,我实际上已经通过了使用劣质外壳从 SBCL Lisp 运行程序(大概 UIOP 就可以了)。 无论如何,现在我可以做到这一点,如果程序在后台运行,我仍然不知道如何与程序交互。 所有这些功能,如连接到正在运行的程序的标准输入和标准输出的管道和流,都被宣传了,只是没有记录。 看起来这是最基本的事情。 有没有人有这样做的例子? 任何帮助表示赞赏。 -托德 回答1 你看过 SBCL 手册吗? RUN-PROGRAM的选项记录在那里:http://www.sbcl.org/manual/#Running-external-programs 我认为您只需要创建流并通过:input 、 :output和:error参数将它们传递给RUN-PROGRAM 。 这是一个示例,我给出了RUN-PROGRAM流参数来执行gnuplot (尽管我没有按照您的意愿打开输入流)。 https://github.com/belambert/cl-gnuplot/blob/master/src/gnuplot.lisp#L18

2022-05-14 22:23:03    分类:技术分享    lisp   common-lisp   named-pipes   sbcl

Default :test in MEMBER doesn't find '(A B) in '((A B))

问题 >(setq X '(A B)) >(member X '((A B))) NIL >(member X (list X)) ((A B)) >(equal (list X) '((A B))) T >(member X '((A B)) :test #'equal) ((A B)) 回答1 在哪里可以找到答案并不是很明显。 在更高级别浏览 HyperSpec 会很有帮助。 虽然前几次可能很乏味,但你会从文档中得到很多,而且它通常是“可重用的”——许多类似问题的答案都在同一个地方。 在这种情况下,正如 jkiiski 在评论中提到的那样,答案在 17.2.1 Satisfying a Two-Argument Test 中,其中指出: 如果既没有提供 :test 也没有提供 :test-not 参数,就好像提供了 #'eql 的 :test 参数一样。 (注意:值得注意的是 this 做了什么,没说什么。这并不是说 test 参数的默认值是#'eql ,也不是说如果test或test-的值not参数是nil ,然后使用#'eql 。我指出这一点并不是为了test ,但相关的关键参数通常可以是nil或未提供,在这种情况下,就好像使用了#'identity 。) 它还列出了适用于哪些函数,描述了如何计算测试(或非测试)函数的参数(基于关键参数),以及其他一些有用的信息。

2022-05-14 17:38:04    分类:技术分享    common-lisp

Calling function from macro inside Quicklisp package

问题 我把失败.asd (in-package :asdf-user) (defsystem "failing" :description "some code destined to fail" :version "0.1" :author "me" :components ((:file "package"))) 和package.lisp (defpackage :failing (:export :foo :bar)) (in-package :failing) (defun foo () 42) (defmacro bar () (let ((x (foo))) `(print ,x))) (bar) 进入~/quicklisp/local-projects/failing 。 使用安装了 Quicklisp 的 Clozure CL,我运行 (ql:quickload :failing) 这给了我 To load "failing": Load 1 ASDF system: failing ; Loading "failing" [package failing] > Error: Undefined function FOO called with arguments () . > While executing: BAR, in process listener(1

2022-05-10 18:39:08    分类:技术分享    macros   lisp   common-lisp   quicklisp

How to read user input in Lisp

问题 我对 Lisp 很陌生,正在尝试编写一个程序,它只要求用户输入 3 个数字,然后将它们相加并打印输出。 我读过您可以使用以下功能: (defvar a) (setq a (read)) 在 Lisp 中设置变量,但是当我尝试使用 LispWorks 编译我的代码时,我收到以下错误: End of file while reading stream #<Concatenated Stream, Streams = ()> 我觉得这应该相对简单,不知道我哪里出错了。 回答1 我没有使用 LispWorks,所以这只是一个猜测。 当编译器遍历您的代码时,它会到达(setq a (read))行,它会尝试读取输入,但编译时没有输入流,因此您会收到错误。 写一个函数: (defvar a) (defun my-function () (setq a (read)) 它应该工作。 回答2 这应该在您的 Lisp 中正确评估: (defun read-3-numbers-&-format-sum () (flet ((prompt (string) (format t "~&~a: " string) (finish-output) (read nil 'eof nil))) (let ((x (prompt "first number")) (y (prompt "second

2022-05-09 06:19:04    分类:技术分享    lisp   common-lisp   lispworks

Connection refused error installing quicklisp

问题 在 SBCL 中评估(quicklisp-quickstart:install)我得到 (linux): debugger invoked on a SB-BSD-SOCKETS:CONNECTION-REFUSED-ERROR in thread #<THREAD "main thread" RUNNING {1002978FF3}>: Socket error in "connect": ECONNREFUSED (Connection refused) Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. (SB-BSD-SOCKETS:SOCKET-ERROR "connect") 在 CMUCL 我得到: 函数 CONNECT-TO-INET-SOCKET 出错:将套接字连接到 [beta.quicklisp.org:80] 时出错:连接被拒绝 [SOCKET-ERROR 类型的条件] 重新启动:0:[ABORT] 返回顶层。 调试(类型 H 寻求帮助) (连接到

2022-05-09 04:06:03    分类:技术分享    sockets   common-lisp   quicklisp

Lisp: How to get all possible combinations of the elements from lists contained on a list?

问题 我需要在 Common-Lisp 中编写一个函数,它接受一个列表列表并返回一个列表,其中包含子列表中元素的所有可能组合。 因此,例如在 ((1 2) (1 2)) 之类的列表上调用该函数应该返回一个类似 ((1 1) (1 2) (2 1) (2 2)) 的列表。 输入列表可以是任意长度,并且不保证子列表具有相同的长度。 我知道如何使用子列表中的配对元素( inputtting ((1 2) (1 2)) 返回 ((1 1) (2 2)))来获得它,但这对于我的弧一致性算法来说还不够好试图写,我被困住了。 谢谢你。 回答1 (defun combinations (&rest lists) (if (endp lists) (list nil) (mapcan (lambda (inner-val) (mapcar (lambda (outer-val) (cons outer-val inner-val)) (car lists))) (apply #'combinations (cdr lists))))) [2]> (combinations '(1 2)) ((1) (2)) [3]> (combinations '(1 2) '(3 4)) ((1 3) (2 3) (1 4) (2 4)) [4]> (combinations '(1 2) '(3 4) '(5

2022-05-06 10:56:03    分类:技术分享    algorithm   list   lisp   common-lisp

Difference between the 'Standard method combination' and 'Simple method combination' in CLOS

问题 我一直在研究 Common Lisp Object Protocol (CLOS),但遇到了一个疑问。 有人知道CLOS中的“标准方法组合”和“简单方法组合”是什么意思吗? 在“简单方法组合”中,“列表”方法组合意味着什么? (defgeneric what-are-you? (obj) (:method-combination list :most-specific-last)) (defmethod what-are-you? list ((obj fixnum)) "I am a FIXNUM") (defmethod what-are-you? list ((obj float)) "I am a FLOAT") (defmethod what-are-you? list ((obj number)) "I am a NUMBER") 回答1 Common Lisp 预定义了标准方法组合。 这是默认设置。 此外,还有一堆所谓的“简单方法组合”: + 、 and 、 append 、 list 、 max 、 min 、 nconc 、 or和progn 。 请记住,方法组合会查看哪些方法适用于特定的参数集,然后将它们组合成一个有效的方法,并与参数一起调用该方法。 list方法组合结合了所有适用的主要方法(只有这些)并返回所有结果的列表。

2022-05-05 22:10:04    分类:技术分享    methods   lisp   common-lisp   clos   method-combination