我需要一些帮助来在 common lisp 中重写这个函数而不使用 usin SET
,SETF
或者SETQ
(我也不能使用循环),我希望有人可以帮助我。这是代码:
(defun apply-values (DictValues Monomial)
(let ( (Coeff (monomial-coefficient Monomial))
(Vars (varpowers Monomial))
(Acc 1) )
(mapcar (lambda(x)
(setf Acc
(* Acc (expt (cdr (assoc (varpower-symbol x)
DictValues))
(varpower-power x)))))
Vars)
(* Coeff Acc)))
Run Code Online (Sandbox Code Playgroud)
我的问题是在以 开头的行mapcar
。
在此先感谢您的帮助!
我根据用户输入调用函数,但有些函数有两个参数,有些只有一个参数。有没有一种方法可以在参数的值为“NIL”时不传递参数,而不是在每个函数上使用&可选参数(并且从不使用它)?
这是一个交互式小说游戏,其中用户键入一些命令,这些命令将转换为函数调用。
(defun inputs (state)
(format *query-io* "> ")
(force-output *query-io*)
(let* ((entry (cl-ppcre:split "\\s+" (string-downcase (read-line *query-io*))))
(function (car entry))
(args (cdr entry)))
(if (valid-call function)
(funcall (symbol-function (read-from-string function))
state
args)
(progn
(format *query-io* "Sorry, I don't know the command '~a'~%~%" function)
(inputs state)))))
Run Code Online (Sandbox Code Playgroud)
如果用户输入是“装备剑”,我需要调用函数“装备”并传递 '(“剑”) 作为参数,但如果用户输入是“状态”,我需要调用函数“状态”而不需要传递“args”,而不是将它们作为“NIL”传递
在 Common Lisp 中是否有可能得到symbol-name
没有大写结果的 a ?
(symbol-name 'aAbB)
;; => "AABB"
(OTHER_FUNCTION? 'aAbB)
;; => "aAbB"
Run Code Online (Sandbox Code Playgroud)
我想使用符号名称作为字符串但区分大小写。
假设我有以下列表:(A B . D)
。
我如何仅通过使用列表函数来重现这个?
(list 'A 'B '. 'D)
不管用。
我正在读的一本书[1]是这样说的:
\n\n\n编程语言中最有趣的发展之一是可扩展语言的创建,其语法和语义可以在程序内更改。最早和\n最常提出的语言扩展方案之一是宏定义。
\n
您能否给出一个扩展 Lisp 编程语言的语法和语义的 Lisp 宏示例(并附上解释)?
\n[1]解析、翻译和编译理论,第 1 卷解析:Aho 和 Ullman,第 58 页。
\n在我的一本书中,我有这个方案代码,并想将其转换为 Common Lisp:
(define (make-account balance)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch m)
(cond
((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else (error "Unknown request -- MAKE-ACCOUNT" m))))
dispatch)
Run Code Online (Sandbox Code Playgroud)
然后我将使用以下命令创建它:
(define acc (make-account 1500))
Run Code Online (Sandbox Code Playgroud)
然后调用deposit
或withdraw
:
((acc 'withdraw) 50)
或者
((acc 'deposit) 75)
据我了解,
acc
被函数替换dispatch
并返回withdraw
ordeposit
然后计算表达式,例如:
((acc 'withdraw) 50) …
所以我正在尝试学习 lisp,我想出了一个简单的程序来帮助我学习它,它只是一个检查素数的程序。一开始它起作用了:
(dotimes (i 100)
(let ((devisors 0))
(if (> i 2)
(progn
(dotimes (j (+ (/ i 2) 1))
(if (> j 1)
(if (= (rem i j) 0) (setq devisors 1) )
))
(if (= devisors 0) (print i))
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
然后我尝试将素数检查抽象为一个函数,并编写了以下代码:
(defun isprime (num)
(defvar devisors 0)
(dotimes (j (+ (/ num 2) 1))
(if (> j 1)
(if (= (rem num j) 0) (setq devisors 1) )
))
(if (= devisors 0) num 0) …
Run Code Online (Sandbox Code Playgroud) 我在 SO 和书籍上找到了很多资源,但没有一个对我来说是可以理解的(足够的)。我正在尝试使用 LISP 迭代数组。
这是我创建数组的方法:
(setf question-array
(make-array '(8 2)
:initial-contents
'((1 "How old are you:")
(2 "Whats your name:")
...)))
Run Code Online (Sandbox Code Playgroud)
但经过一些研究,看起来我应该使用:
(mapcar (lambda (x)
(print))
'(question-array))
Run Code Online (Sandbox Code Playgroud)
但它只打印:
QUESTION-ARRAY
Run Code Online (Sandbox Code Playgroud)
我想打印每个问题。所以我猜#'第二?我缺少什么?
(更多背景信息:我的目标是向用户提出问题并以某种方式存储答案以在最后计算分数。)
多谢 !
我有一个像这样的a-list
\n(setf *books* \'(\n ( \n (:title \'Titulo 1)\n (:autor (quote Autor 1) )\n ) \n (\n (:title \'T\xc3\xadtulo 2)\n (:autor (quote Autor 2) )\n )\n ; (...) \n))\n
Run Code Online (Sandbox Code Playgroud)\n我需要创建一个根据书名查找书籍的函数。阅读文档后我尝试:
\n(defun string-include (string1 string2)\n (let* ((string1 (string string1)) (length1 (length string1)))\n (if (zerop length1)\n nil \n (labels ((sub (s)\n (cond\n ((> length1 (length s)) nil)\n ((string= string1 s :end2 (length string1)) string1)\n (t (sub (subseq s 1))))))\n (sub (string string2)))))\n)\n(\n defun buscar (books text)\n (remove-if-not \n (lambda …
Run Code Online (Sandbox Code Playgroud) Reddit1.0
我正在尝试阅读此处的代码:
https://github.com/reddit-archive/reddit1.0
但是,如果不了解网站的服务方式,就很难理解网站的架构如何工作。这里的reddit代码似乎不包含任何类型的服务器,因此它一定是在其他地方导入然后运行的,比如Hunchentoot
类似的东西。有人知道答案吗?
common-lisp ×10
lisp ×10
clisp ×2
arrays ×1
hunchentoot ×1
iteration ×1
loops ×1
mit-scheme ×1
primes ×1
reddit ×1
sbcl ×1
scheme ×1