我正在努力扩展并学习lisp。其中一个基础是实现一个简单的堆栈。除了我的pop功能外,一切都正常
;Returns and removes the first element of the stack
(defun my-pop ()
(let (temp (car *stack*))
(setq *stack* (cdr *stack*))
temp))
这将正确删除堆栈的“顶部”,但不会返回它。早些时候,我有一个:
;Returns and removes the
标签: Lisp
stack-overflowtail-recursionbignum
我尝试使用以下尾部递归函数进行求解:
(defun fib (num)
(labels ((fib-helper (num a b)
(cond ((or (zerop num)
(eql num 1))
a)
(t (fib-helper (decf num)
(+ a b)
从“lisp的温和介绍”开始:
如果给定循环列表,如#1=(a B C.#1#)作为输入,则长度可能
根本不返回值。在大多数实现中,它将进入一个
无限循环
这仍然是真的吗?这是一个bug吗?为什么不先检查一下列表的性质呢?一般用于处理序列;循环性问题与列表相关,但与字符串或数组无关。专门用于列表,并按预期用于正确的列表,但对于循环列表返回nil 在R7RS Scheme和Common Lisp等现代实现中,它们确实识别循环列表,但为了减少开销,CL既有长度,可能会挂起,也有可能在检测到循环时返回
我是lisp的新手。我没有正确理解如何在列表上实现append函数。我尝试了以下程序
(defvar temp)
(setq temp '())
(append temp (logxor 1 0))
当温度应该存储1时,它似乎只存储零值 返回新值,但不修改其参数。
您需要使用:
或者(这会添加到列表的开头,而不是结尾!):
返回新值,但不修改其参数。
您需要使用:
或者(这会添加到列表的开头,而不是结尾!):
(setq temp (append temp (list 1)))
(push
我正在尝试编写一个名为calculate的函数,它获取一个列表作为输入,并计算其值(用作lambda演算减缩器)
这是我的密码:
(defun substitue(x y z)
(cond ((atom z) (cond ((eq z y) x)
(T z)))
(T (cons (substitue x y (car z))
(substitue x y (cdr z))))))
(defu
我阅读了8.5国外数据结构示例一章,发现有问题。
我使用以下示例来验证它是否可以正确运行。
_______________________________________________________________
或考虑一个外部C变量的例子和一些访问:
struct c_struct {
short x, y;
char a, b;
int z;
c_struct *n;
};
extern struct c_struct *my_struct;
my_
我下面的代码片段将给出SB-INT:SIMPLE-READER-PACKAGE-ERROR;
我知道这是因为在REPL读取代码时还没有定义包“quicklisp quickstart”;但是包是在“quicklisp.lisp”中定义的
如何使以下代码正常工作?
或者,我如何告诉公共lisp读取器这个包将在动态加载的文件中定义
* (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
问题:
((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
这是期中考试的#1,我写了“819”,他以为我忘了在lawl中划掉一个,所以我划掉了81,他走偏了。不管怎样,我不明白为什么是81
我理解为什么(lambda(x)(*x))(*3)=81,但是第一个lambda我不理解x和y值在那里,以及[body](xy)的作用
所以我希望有人能向我解释为什么第一部分看起来没有任何作用。这需要一些缩进来澄清
((lambda (x y) (x y
我是lisp新手,我只是尝试在条件返回true时同时调用两个函数
(cond
((equals (first expression) "+")
(function1 parameter)
(function2 parameter)))
在上面的代码中,我只希望调用function1和function2。有什么想法吗?是的,像这样进行:
(cond
((equals (first expression) "+")
(progn
(function1 par
无法读取文本文件
读取:输入流#1=#已到达其末尾
[类型系统的条件::简单文件结尾]
意思是“已经到了尽头。”这意味着您已经读取了打开流的位置上的所有可用数据,然后尝试读取更多数据。查看HyperSpec上的文档:
默认情况下,READ,READ-CHAR,以及类似的函数将在流中没有更多数据可读取时,发出类型为END-of-FILE的条件信号
如果您希望它在尝试读取流结束时返回特定值,则需要将nil传递给函数的eof-error-p参数,将值、符号或关键字传递给函数的eof value参数;
我使用asdf安装将ltk安装到Steel Bank Common Lisp,但我甚至无法开始使用它。下面的代码是文档中最简单的示例,几乎是逐字复制的
这是我从sbcl收到的错误消息:
>;输入:λ零
; (B组)
;
; 警告:
; 未定义的函数:PACK
; (带-LTK零)
(B(MAKE-INSTANCE’按钮:MASTER NIL:TEXT“Press Me”:COMMAND#)
((B))
;
; 警告:
; 未定义的函数:带-LTK
;
; 编
假设我有一个函数
CL-USER> (defun trimmer (seq) "This trims seq and returns a list"
(cdr
(butlast seq)))
TRIMMER
CL-USER> (trimmer '(1 2 3 VAR1 VAR2))
(2 3 VAR1)
CL-USER>
请注意,由于QUOTE,VAR1和VAR2没有解析。假设我要将符号VAR1和VAR2解析为它们的值-是否有标准函数来执行此
我被要求对以下问题提出尽可能多的解决方案:
编写一个函数,该函数包含两个数字列表(均假定为
以升序排列),并将它们合并到一个列表中(也以升序排列)
升序)
我的第一个解决方案是将列表1附加到列表2上,然后重新排序
然后我找到了一个内置的合并
然后我决定自己实际实现一个解决方案,我提出了一个尾部递归函数,目前它只适用于列表的子集
问题本身似乎是我终于有了阅读Knuth的理由,但唉,Uni和图书馆因为下雪而关闭了
所以我转向你们,对于这个问题,有什么有趣的、有效的或反模式的方法
另外,我不是在寻找
在公共Lisp中是否有类似于PHP的str_replace的函数
有一个名为cl ppcre的库:
(cl-ppcre:regex-replace-all "qwer" "something to qwer" "replace")
; "something to replace"
通过安装。我认为标准中没有此类功能。如果不想使用正则表达式(cl ppcre),可以使用以下方法:
(defun string-replace (search replace string &optional
我正在使用MIT/GNU方案。如果我计算两个整数的商,而商是浮点,那么输出不是浮点数,而是两个数的表达式,比如:122222232/23444412。如何获得浮点格式输出?使用以下功能:
(let ((x (/ 5 7)))
(let ((f (exact->inexact x)))
(display f)))
格雷格,请看一看。谢谢。@Yasir:恐怕我不明白这个问题与这个答案有什么关系。精确->不精确是不精确的传统名称(名称错误)。结果不是“浮动”,而是比率。
我将稀疏多项式表示为(系数,对)列表。例如:
'((1 2) (3 6) (-20 48)) => x^2 + 3x^6 - 20x^48
我不熟悉Lisp格式,但是遇到了一些非常漂亮的工具,比如(format nil“~:[+~;-~]”(>0系数))以文本形式获取系数的符号(我知道,这可能不是惯用法)
但是,格式化单个术语时会出现某些显示问题。例如,以下各项均应为真:
(1 0) => 1x^0 => 1 (reducible)
(1 1) => 1x^1 =
我不明白Lisp是如何编译和动态的。对于一种能够操作、修改和生成代码的语言来说,这不是一种需要解释的要求吗?一种语言是否可能被完全编译并且仍然是动态的?还是我遗漏了什么?Lisp在做什么,使它既可以编译又可以动态
对于一种能够操作、修改和生成代码的语言来说,这不是一种需要解释的要求吗
没有
一种语言是否可能被完全编译并且仍然是动态的
对
还是我遗漏了什么
对
Lisp在做什么,使它既可以编译又可以动态
它是动态编译的,就像大多数java和PyPy的实现一样。Lisp是一个广泛的语言和实现家族
L
我需要一些帮助来理解这段代码的作用。我不确定fcombine变量的作用是什么?有人能给我一个代码正在做什么的演练吗
(define (reduce fcombine L)
(cond
((null? (cdr L)) (car L))
(#t (fcombine (car L) (reduce fcombine (cdr L))))))
你可以看看CLHS规范
您所展示的函数是完整规范的部分实现,只有函数和序列参数。您可以看看CLHS规范
您显示的函数是完整规范的部分实现,
我很难找到答案,所以可能不可能。我希望能够灵活地从命令行加载/编译lisp文件,即不在emacs内,然后也从命令行运行该文件中的一个lisp函数。这无疑是特定于实现的特性,所以实现中提供这一特性的任何指针(或者可能是相当标准的,我不知道)。我正在使用SBCL,并且喜欢它,所以如果它能做到这一点,那就太好了
另外,我正在使用Mac OSX和终端。以下是来自的粘贴:
克里普
如果您使用的是CLISP Common Lisp环境,则以下内容适用
要将名为test.lisp program的程序编译成名
我在网上四处张望,找不到我的问题的答案。
如果有人能提供一个好的答案而不贬低这个帖子,我将不胜感激
在Lispcar中,cdr用于数据模式,如'(这里的任何内容),这对我来说很有意义
现在,在《Lisp之地》一书中,作者正在解释如何构建一个文本引擎,突然他使用下面的描述来创建一个函数
(defun describe-location (location nodes)
(cadr (assoc location nodes)))
我能问一下他为什么在列表上做cadr,为什么它提供了一个响应而
假设我想得到一个函数的文档,我会说
(documentation 'foo 'function)
但是如果我只有foo和function作为字符串呢?例如“foo”和“函数”
我必须对它们做些什么才能使它们可用作文档调用的参数
[旁注:我正在使用clisp,但我怀疑这是否重要。]用于将字符串转换为符号。请确保字符串大写,因为与符号不同,读取器不会为您这样做:
(在SBCL中测试):
使用FIND-SYMBOL,而不是INTERN。如果要查找现有函数的文档,只需查找符号即可实习生也会创建符号
C
我试图从文本文件中读取电路板,但在打印时,它也打印换行符和倒逗号:
(with-open-file (stream "brd1.txt")
(do ((line (read-line stream nil)
(read-line stream nil)))
((null line))
(print line)))
"+ + +^M"
" 3 3 ^M"
"+ + +^M"
" ^M"
"+ + +"
NIL
我是LISP的新手。有人能
我是一个初学者,自己学习通用Lisp。假设我们有一份清单
((120)(230)(540))。
给定值2,我们希望函数在列表中搜索并返回
(230)。或者,如果给定值5,则应返回(5 40)。你明白了。
通常我们可以用一个谓词,比如
(defun isIndexp (n point)
(eq n (car point)))
为find函数返回T或NIL。但问题是如何将参数传递给谓词isIndexp?我试图将一个参数n传递给find的谓词函数isIndexp,但该代码抛出了一些错误,因为is
我目前正试图将我的头脑集中在软件包、系统和公司上
我现在已经读了几遍了,我想我仍然很难把它弄对
如果我只是想将一个Lisp源文件拆分为两个文件,其中一个文件应该“使用”另一个文件——我该怎么做?我需要为此建立一个系统吗?我应该使用模块吗…?我来自Node.js的背景,在那里你可以简单地说
var foo = require('./foo');
获取文件foo.js中导出内容的引用。在Lisp中,与此最接近的等效项是什么
我理解这是针对系统的,并且至少根据其文档,它是捆绑的一部分:
ASDF与所
我使用sbcl+emacs+slime
我用lisp编写函数,
我使用C-C-Ccompile,但我已经删除了它。
我找不到它。我想知道我如何定义它
我尝试使用函数lambda表达式,但得到以下结果:
(function-lambda-expression #'b)
T
B
我希望有人能给我一些帮助。提前非常感谢
谢谢你。
如果函数在repl中定义,我可以使用(descripi#'function-name)获取我如何定义函数,但是如果我通过C-C-C定义它,我只会获取源文件
根据您的调试和
前言:我目前正在学习一门简明课程,显然是用LISP教授的,我一生中从未使用过LISP,所以我不得不在一个周末学习这门语言。我为这个糟糕的代码提前道歉。我只是对LISP的语法非常熟悉,可以让代码正常工作,仅此而已
我目前正在开发一个解决地图着色问题的程序。此代码采用一个序列,其中每个子序列的第一个元素是状态,第二个元素表示颜色。例如:“A R B G C G D Y E B F B,然后检查以确保没有任何状态具有与约束列表定义的受约束状态相同的颜色。我知道可能有很多更干净、更简单的方法可以做到这一
如何为所有功能设置优化选项,如“速度3”
(declaim (optimize (speed 3) (debug 0) (safety 0))
不起作用(
让我们检查分解一个函数的输出:
* (disassemble 'fib)
; disassembly for FIB
; Size: 148 bytes. Origin: #x1003A5529E (segment 1 of 3)
; 29E: L0: 498B4C2460 MOV RCX, [R12+96]
我试图在CLISP中打印数组的值,我在下面的函数中写道:
(setq x (make-array '5 :initial-contents '(a b c d e)))
(loop for i from 0 to 4 do (write aref x i))
但我犯了一个错误
*** - PROGN: variable AREF has no value
The following restarts are available:
USE-VALUE :R1
我有以下代码:
(defun TREE-CONTAINS (N TREE)
(cond (( = (car TREE) nil) nil)
(( = (car TREE) N) t)
(t TREE-CONTAINS (N (cdr TREE)))
)
)
它接受一个数字N和一个列表树,并检查列表树中是否存在N。非常简单,但由于某种原因,我在调用函数时不断遇到这个错误
(TREE-CONTAINS 3 '((1 2 3) 7 8))
*** - +:
我是皮科利普的新手
我试了一下,得到了一个错误:
: ('(1 2) 6)
Segmentation fault
但是,如果我尝试:
: ('(a b c) 6)
-> NIL
我基本上理解了原因,但令人惊讶的是PicoLisp的响应是SEGFULT而不是错误。这是否意味着Picolisp不会检查一个数字是否是函数,但当它是一个符号时会检查?(从中提取)
是的,这是预期的行为
PicoLisp对列表中的汽车进行评估,可能会重复评估,直到它击中目标
在一个函数上。函数可以是列表(然后是L
我正试图为Audacity编写一个简单的测量插件,它就像在我的脑袋上敲打石头一样有趣。我所要做的就是获取一块音频并找到所有样本(块)的平均值,这样我就可以将其作为一个数字呈现给用户,这样我就可以从样本中减去DC偏移量,以便进一步处理。我知道并理解我想做的数学,但我不知道如何在Lisp/XLisp/Nyquist/任何语言中做
据我所知,这是没有功能的。由于某些原因,实际上并不像您所期望的那样计算声音的平均值。它首先计算绝对值,然后计算平均值计算平均值,然后计算绝对值。即使有一个单独的snd a
我目前正在尝试执行练习1.22,它需要一个名为runtime的函数,该函数返回系统已运行的毫秒数。然而,我的环境(R5RS)似乎没有这样的功能。它也没有时间、当前毫秒、当前不精确毫秒等
我可以使用什么功能来配置我的功能?哪些函数返回经过的毫秒数、微秒数等?当然,我更喜欢可用的最高精度计时器。我做这个练习时使用的计时器剧透警报:你可以在我的博客上看到我的解决方案
顺便说一句,我只是在问了一个类似的问题后才解决了这个问题,也许,最好的办法是将DrRacket中的语言切换为“使用源代码中声明的语言”,
我想写一个函数,可以计算GPA。现在我只能做3次有限的计算,但我坚持要做更多的计算,而不使用循环或递归——这是主题的要求——如何扩展第n个函数?比如:n,如果是的话,这意味着我需要写一个lambda表达式吗?作为一个新手,我可能无法清楚地描述这个问题,真的需要一些帮助
Glist是分数Clist是学时
GPA=成绩点*积分小时数+成绩点*积分小时数/积分小时数之和,如:3*1+3*2+4*1/1+2+1
这是我的密码:
(defun gpa (Glist Clist)
(format
我试图用我拙劣的英语技巧来描述这个问题:
我的dwg文件中有闭合块,这些块由许多连接在一起的多段线组成,但它们不是一体(集成),我只需要一个lisp在该块上绘制多边形并创建一体块。有办法吗?
thnx假设:
当你说“连接”时,你的意思是他们的末端相触
当你说“uni body”时,实际上是指AutoCAD意义上的“joined”
然后尝试以下操作:
(defun convert_block_to_polyline (block / old_entlast new_entlast curr p
我知道“cond”是基于“if”的,但是“cond”能做“if”能做的一切吗?
谢谢是的。任何条件
(if x y z)
使用if可以使用cond转换为等效条件:
(cond ((x y)
(t z)))
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
“if”很可能作为一个围绕“cond”的宏来
我想创建一个函数,该函数接收2个参数,并返回一个函数,该函数接收一块板。该功能需要检查用户输入,并根据输入在电路板中进行更改。我对用户输入和我对电路板所做的更改没有任何问题。我的问题是返回函数的函数。为了做到这一点,我使用了一个lambda。这是我正在研究的代码:
(defun faz-jogador-manual (n_aneis peca)
#'(lambda (tabuleiro)
(setf jogada (le-posicao))
(let ((num_anel (fi
我无法读取racket博士的输出。默认情况下,它使用MCON显示列表。例如,sicp练习2.32生成:
> (subsets (list 1 2 3))
(mcons
(mcons
'()
(mcons
(mcons 3 '())
(mcons
(mcons 2 '())
(mcons
(mcons 2 (mcons 3 '()))
(mcons
(mcons 1 '())
(mcons
(mc
如何使用MAPCAR函数在Common Lisp中以非递归方式实现与REMOVE-IF等效的函数?使用MAPCAR是不可能的,因为它总是返回与输入长度相同的列表(如果某些输入元素满足谓词,则需要较短的列表)
但是可以使用相关功能MAPCAN。如果你
将谓词应用于每个元素X。
如果X满足谓词,则替换(X)如果X不满足谓词,则替换NIL
连接结果列表
然后,您将获得一个列表,其中包含不满足谓词的元素(根据需要)
MAPCAN将结合这些操作,给定一个实现步骤1的函数
例如:
(defun list-i
我在Lisp教科书中读到:
Lisp可以对数字进行一些惊人的处理,尤其是与大多数其他语言相比。例如,这里我们使用函数expt计算53的53次方:
大多数语言都会因涉及如此大量的计算而窒息
是的,这很酷,但是作者没有解释为什么Lisp可以比其他语言更容易、更快地实现这一点
当然有一个简单的原因,有人能解释吗?为了补充wvxvw所写的内容,在Lisp中更容易,因为bignum是内置在语言中的。您可以像在C或Java中处理整数一样处理大量的数字。这是一个很好的例子
新泽西方法
“传统”语言,如C/C+
我正在尝试创建一个函数来计算列表中列表的数量
(defun test (a)
(if (equal a nil) (return-from test 0))
(if (not (listp a)) (print "case a") (return-from test (+ 0 (test (cdr a))))
(print "case b")(return-from test (+ 1 (test (cdr a)))))
我想设置ASDF存储编译文件的目录。我更喜欢用shell脚本来完成它。根据,应该定义环境变量ASDF\u OUTPUT\u TRANSLATIONS
好的,给你:
$ export ASDF_OUTPUT_TRANSLATIONS="$HOME/.cache/common-lisp/my-dir/"
但当我尝试测试配置时,它不起作用:
$ clisp -x "(asdf:compile-system :my-system)"
输出:
;; Loading file /home/mark/.c
我创建了一个函数,可以从嵌套列表中随机选择一个“位”,例如,((1001)(1111)(0101)),然后翻转它。如果是1,则将其设为0,反之亦然。这个函数运行得很好,但我发现它改变了原始参数,尽管我复制了一个。这是函数,最后的两个写操作演示了这个问题。如果我把((1))传递给这个,我希望看到(write-DNA-seq)打印的这个原始值,但是原始值被修改了,所以(write-DNA-seq)和(write-CDNA-seq)打印相同的东西
(defun rand-mutate (DNA-seq
我使用LISP在emacs中工作,遇到了一个错误,我不知道如何解决。我将展示输出、我从中了解到的内容以及我缺少的内容
错误:
junk in string "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)"
[Condition of type SB-INT:SIMPLE-PARSE-ERROR]
Backtrace:
0: (PARSE-INTEGER "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)" :START 0 :END NIL :RADIX
我在用球拍和球拍医生
有一个内置函数叫做
andmap的内置版本是这样工作的:
> (andmap positive? '(1 2 3))
#t
函数号通常用作:
(number? 3)
> #t
(number? '())
>#f
我不明白为什么会发生这种情况:
(andmap number? '())
> #t
我认为结果应该是错误的
文件说:
*If the lsts are empty, then #t is returned.*
这到底是为什么?我
我想创建一个函数,该函数将整平一个列表,并删除其中所有潜在的nil
预期行为,示例1:
(myfunc '(a (b (c) (d)) (e f) (g (h)) nil)) => (a b c d e f g h)
预期行为,示例2:
(myfunc '(a . d)) => (a d)
到目前为止,我的职能是:
(defun myfunc (l)
(cond
((atom l) nil)
((and (atom (car l)) (not
我正在用CommonLisp编程,我需要一个算法来删除包含(至少)两个公共元素的子列表
我不知道怎样才能解决这个问题。我想用这个:
(删除重复项列表(列表)(删除重复项列表:测试'equal:key'cdr))
但是子列表之间的cdr是不同的,我只是不知道如何计算两个元素并删除子列表。
此外,我不需要删除“原始”子列表(在示例中为“(1234))、仅bot(234)和(1234)
例如:
输入:‘(1234)(234)(5678)(134)(999))
输出:‘(1234)(56789))
输入
以下是我个人对LISP列表的定义,基本正确吗
LISP中的所有列表都是使用节点和下一个指针的空指针构造为单链表的
编辑:为了澄清,我用“无效指针”来表示对cons单元的CAR和CDR的性质的想法。我知道LISP中不存在“void pointer”,我在这里尝试将C的概念应用到LISP中将LISP列表视为CONS对,在CAR中有值,在CDR或nil(空列表)中有值。你可以把任何列表看作是它们的结构
e、 g.(列表1 2 3)=>(cons 1(cons 2(cons 3 nil))将Lisp列表
如何使用cons或其他方式打印第n个号码之前的号码列表
(defun pellse (k)
(if (or (zerop k) (= k 1))
k
(+ (* 2 (pellse (- k 1)))
(pellse (- k 2)))))
(print (pellse 7))
一种可能的解决方案是使用Common Lisp的宏,例如:
(print
(loop for x in '(1 2 3 4 5 6 7)
for y = (p
想知道上面的代码是做什么的吗?它定义了一个交错两个列表的函数。
例如,按如下方式调用:
(defun interleave (x y)
(cond ((and (null x)(null y)) nil)
(t (cons (car x) (cons (car y) (interleave (cdr x) (cdr y)))))
将给出列表(a d b e c f)
编辑
解释如下:
(defun interleave(x y)声明接受2个参数(或列表)的函数interl
我创建静态数组,建议在字符串中查找数组大小的数字
我想一直走到最后
(let((*read eval*nil))(从字符串读取(格式为nil“#(~a)”数据))(let(*read eval*nil))(从字符串读取(格式为nil“#(~a)”数据))
(setf arr (make-array'(5)))
(loop for i from 0 to 4
do (if (/= nil (read-from-string str))
(setq x (read-fro
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 64 页