标签: lisp

不使用 set、setf 或 setq 重写

我需要一些帮助来在 common lisp 中重写这个函数而不使用 usin SETSETF或者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

在此先感谢您的帮助!

lisp loops clisp functional-programming common-lisp

0
推荐指数
1
解决办法
160
查看次数

有没有办法在 Common-Lisp 中不传递参数而不是传递“NIL”?

我根据用户输入调用函数,但有些函数有两个参数,有些只有一个参数。有没有一种方法可以在参数的值为“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”传递

lisp common-lisp

0
推荐指数
1
解决办法
407
查看次数

获取不带大写的符号名称

在 Common Lisp 中是否有可能得到symbol-name没有大写结果的 a ?

(symbol-name 'aAbB)
;; => "AABB"

(OTHER_FUNCTION? 'aAbB)
;; => "aAbB"
Run Code Online (Sandbox Code Playgroud)

我想使用符号名称作为字符串但区分大小写。

lisp common-lisp

0
推荐指数
1
解决办法
105
查看次数

如何仅使用 lisp 中的列表函数创建带有点对的列表?

假设我有以下列表:(A B . D)

我如何仅通过使用列表函数来重现这个?

(list 'A 'B '. 'D)不管用。

lisp common-lisp

0
推荐指数
2
解决办法
499
查看次数

Lisp 宏如何扩展 Lisp 编程语言的语法和语义?

我正在读的一本书[1]是这样说的:

\n
\n

编程语言中最有趣的发展之一是可扩展语言的创建,其语法和语义可以在程序内更改。最早和\n最常提出的语言扩展方案之一是宏定义。

\n
\n

您能否给出一个扩展 Lisp 编程语言的语法和语义的 Lisp 宏示例(并附上解释)?

\n

[1]解析、翻译和编译理论,第 1 卷解析:Aho 和 Ullman,第 58 页。

\n

lisp common-lisp

0
推荐指数
1
解决办法
194
查看次数

将 MIT Scheme 代码逻辑转换为 Common Lisp

在我的一本书中,我有这个方案代码,并想将其转换为 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)

然后调用depositwithdraw

((acc 'withdraw) 50) 或者

((acc 'deposit) 75)

据我了解, acc被函数替换dispatch并返回withdrawordeposit 然后计算表达式,例如: ((acc 'withdraw) 50) …

lisp scheme sbcl common-lisp mit-scheme

0
推荐指数
1
解决办法
106
查看次数

循环遍历数字并检查素数 - 未检测到素数

所以我正在尝试学习 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)

lisp primes clisp common-lisp

0
推荐指数
1
解决办法
111
查看次数

LISP - 迭代数组 - MAPCAR

我在 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)

我想打印每个问题。所以我猜#'第二?我缺少什么?

(更多背景信息:我的目标是向用户提出问题并以某种方式存储答案以在最后计算分数。)

多谢 !

lisp arrays iteration common-lisp

0
推荐指数
1
解决办法
340
查看次数

LISP 在列表中查找项目

我有一个像这样的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)

lisp common-lisp

0
推荐指数
1
解决办法
108
查看次数

Reddit 最初是用 Lisp 编写的,它使用什么网络服务器?

Reddit1.0我正在尝试阅读此处的代码:

https://github.com/reddit-archive/reddit1.0

但是,如果不了解网站的服务方式,就很难理解网站的架构如何工作。这里的reddit代码似乎不包含任何类型的服务器,因此它一定是在其他地方导入然后运行的,比如Hunchentoot类似的东西。有人知道答案吗?

lisp common-lisp reddit hunchentoot

0
推荐指数
1
解决办法
216
查看次数