问候,
阅读Simply Scheme Chapter 09 就我所见,Lambda 似乎很重要。我想把它练到骨子里,所以我正在寻找针对lambda 的Project Euler 的初学者练习(最好是非递归的)。让包容是奖金。有资源吗?
在网上,我找到了这个和对Simply Scheme 的引用。我知道有好书,但我真的只是在寻找练习。
非常感谢。
I want to implement cond (using lisp macros in guile) with if, this my attempt:
(define-macro (cond . clauses)
(if (pair? clauses)
(let ((first (car clauses)) (rest (cdr clauses)))
`(if ,(car first)
(begin
,@(cdr first))
,(if (equal? (caar rest) 'else)
',(cadr rest)
`(cond ,rest))))))
Run Code Online (Sandbox Code Playgroud)
but it don't work, when I call it with this code:
(cond ((= 1 0) (display "hello"))
((= 1 1) (display "world"))
(else
(display "foo")))
Run Code Online (Sandbox Code Playgroud)
I got this error:
ERROR: In procedure car: Wrong type argument …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个将中缀输入更改为前缀的函数,例如:(x + 1)作为输入输出为(+ x 1).
所以这是我目前的代码:
(setq x '(Y + 1))
(if (listp x ) (list (second x) (first x) (first (last x))) x)
Run Code Online (Sandbox Code Playgroud)
所以(+ Y 1)如果我输入一个列表它会返回,如果它不是一个列表则返回用户输入。
但是,问题是我无法在函数中使用此代码:
(defun prefixToInfix (x)(
(if (listp x ) (list (second x) (first x) (first (last x))) x)
)
)
Run Code Online (Sandbox Code Playgroud)
该函数确实已创建,但是当我调用它时
(prefixtoinfix '(Y + 1))
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
Error: Illegal function object: (IF (LISTP X) (LIST # # #) X).
[condition type: TYPE-ERROR]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我的 if 语句在主程序中有效,但当我从我的函数中运行它时却没有。
我想问一下为什么我的函数不需要使用 values 函数来输出嵌套列表?
(defun p2 (l)
(cond
((null l) nil)
((listp (car l)) ( values (p2 (car l)) (p2 (cdr l))) )
(t (princ (car l)) (princ " ") (p2 (cdr l)))
))
Run Code Online (Sandbox Code Playgroud)
我的意思是,cond如果条件为真,构造是否不返回 1 个值或执行 1 个操作?
为什么这样做?
我一直在思考玻璃市的格言,
LISP程序员知道一切的价值,却一无所获。
我可以找到一些提示和简短的解释,但对于引号的真正含义却无法获得清晰,有见地的解释,尤其是对于Lisp程序员而言。
您能先描述简单的单词,CS初学者容易理解的内容,再解释更多技术方面的内容,再通过描述代码所暗示的相关结构,操作或情况(可能使用代码或伪代码示例)来解释Perlis的命令吗?
我正在创建一个递归函数,用于计算列表中的原子数。它应该能够计算嵌套列表的原子数。例如:(a(bc)ed)或(a(bc(ge))ed),应分别计算b和c或分别计算b,c,e和d而不是整体。
这是我创建的功能:
(defun count-atoms (mylist)
(cond
((null mylist) 0)
((listp (car mylist)) (count-atoms (car mylist)))
((atom (car mylist)) (+ 1 (count-atoms (rest mylist))))
)
)
Run Code Online (Sandbox Code Playgroud)
我得到的输出是3,但应该是5(基于(a(bc)ed))。我猜想函数到达c时就停止了。如何使函数不止于c并返回最外层列表。
我迷失了评估这段代码以查找错误的念头。我不确定为什么会得到未定义的函数。有人可以指导我理解原因吗?谢谢!
O应该是一个对象,L应该是一个列表。我正在尝试将O附加到列表的末尾并返回列表
(defun my_attach(O L)
(cond ((eq L nil )
O )
(t (cons (car L) (my-attach O (cdr L)) )
)
)
)
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试编写一个函数,以十进制返回列表的平均值。
(defun calc-list-average (lst)
(float (/ (apply '+ lst) (length lst))))
Run Code Online (Sandbox Code Playgroud)
当我像这样调用函数时,一切正常:
(defvar *a-lst* '(5 6 1 3 6 7))
(princ (calc-list-average *a-lst*))
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用动态生成的列表调用该函数时,我收到错误“给 + 的参数列表被打点(由 WUERFEL-ERGEBNIS 终止)”
(let ((wuerfel-seiten 6) (wuerfel-ergebnis ()))
(loop
(let ((menu-option (get-option)))
(cond ((eql menu-option 1)
(princ "Bitte geben Sie die Anzahl der Wuerfelseiten ein: ")
(setq wuerfel-seiten (read)))
((eql menu-option 2)
(princ "Bitte geben Sie die Anzahl der Wuerfelwuerfe ein: ")
(let ((wuerfel-wuerfe (read)))
(setq wuerfel-ergebnis (get-random-list wuerfel-seiten wuerfel-wuerfe))))
((eql menu-option 3)
(write-line "Wuerfelauswertung") …Run Code Online (Sandbox Code Playgroud) 在下面的函数中,我用 mac-1 替换了宏,它只返回它工作的参数的值,但 mac-2 抛出一个类型错误。有人可以解释会发生什么并导致此错误吗?为什么 x 从 fun-2 传递给 mac-2 是文字符号x而不是整数?
(defmacro mac-1 (x) x)
(defun fun-1 (x) (mac-1 x))
(fun-1 3) ; => 3
(defmacro mac-2 (x) (+ x 3))
(defun fun-2 (x) (mac-2 x))
(fun-2 3)
Run Code Online (Sandbox Code Playgroud)
执行编译有错误的表单。形式:(MAC-2 X) 编译时错误:在 (MAC-2 X) 的宏扩展期间。使用BREAK-ON-SIGNALS进行拦截。
绑定 SB-KERNEL::X 时,值 X 不是 NUMBER 类型