相关疑难解决方法(0)

在Common Lisp中定义setf-expanders

事情就是这样:我没有"获得"setf-expanders,并希望了解它们是如何工作的.

我需要了解它们是如何工作的,因为我遇到了一个问题,这似乎是为什么你应该学习setf-expanders的典型例子,问题如下:

(defparameter some-array (make-array 10))

(defun arr-index (index-string)
  (aref some-array (parse-integer index-string))

(setf (arr-index "2") 7) ;; Error: undefined function (setf arr-index)
Run Code Online (Sandbox Code Playgroud)

如何为ARR-INDEX编写合适的setf-expander?

common-lisp setf

13
推荐指数
2
解决办法
1935
查看次数

如何修改具有任意功能的地方

有时我们需要修改一个地方,但这里没有符合我们需求的内置功能.

例如,这里是incfdecf加法和减法:

CL-USER> (defvar *x* 5)
*X*
CL-USER> (incf *x* 3)
8
CL-USER> *x*
8
CL-USER> (decf *x* 10)
-2
CL-USER> *x*
-2
Run Code Online (Sandbox Code Playgroud)

但乘法和除法怎么样?如果我们希望修改具有任意功能的地方,如下所示:

(xf (lambda (x) ...) *x*)
Run Code Online (Sandbox Code Playgroud)

xf 实用程序非常有用,特别是当我们必须处理深层嵌套结构时:

(my-accessor (aref (cdr *my-data*) n))
Run Code Online (Sandbox Code Playgroud)

lisp macros common-lisp variable-assignment

7
推荐指数
2
解决办法
184
查看次数

写一个破坏性的宏或函数像incf?

我需要一个incf在增量期间执行某些边界检查的函数:

val := val + delta
if val >= 1.0
   then return 1.0
   else return val
Run Code Online (Sandbox Code Playgroud)

我可以这样写incf:

(defun incf-bounded(val delta)
  (incf val delta)
  (if (>= val 1.0) 1.0 val))    
Run Code Online (Sandbox Code Playgroud)

在这种情况下我需要使用它(setf x (incf-bounded x delta)).但是我该怎么写一个我可以使用的(incf-bounded x delta),比如,哪里x会被修改?

lisp macros common-lisp

3
推荐指数
1
解决办法
390
查看次数

关于onlisp中的广义变量

我不知道这里发生了什么,文中的宏观例子.基本上,不熟悉如何使用get-setf-method,内置宏(可能是函数?).具体来说,get-setf-method的某些返回值为零的情况怎么样?例如(get-setf-method'x)

NIL ;
NIL ;
(#:NEW-3069) ;
(SETQ X #:NEW-3069) ;
X
Run Code Online (Sandbox Code Playgroud)

为什么这个示例代码首先将第五个返回值设置为第二个返回值,以进行初始化?最后它如何处理在表达式中设置变量的顺序,例如(aref ar(incf i)

(get-setf-method '(aref ar (incf i)))

(#:G3070 #:G3071) ;
(AR (INCF I)) ;
(#:G3072) ;
(SYSTEM::STORE #:G3070 #:G3071 #:G3072) ;
(AREF #:G3070 #:G3071)
Run Code Online (Sandbox Code Playgroud)

这是宏的定义:

(defmacro sortf (op &rest places)
  (let* ((meths (mapcar #'(lambda (p)
                             (multiple-value-list
                              (get-setf-method p)))
                        places))
         (temps (apply #'append (mapcar #'third meths))))
    `(let* ,(mapcar #'list
                     (mapcan #'(lambda (m)
                                  (append (first m)
                                          (third m)))
                             meths)
                     (mapcan #'(lambda (m)
                                  (append (second …
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp

3
推荐指数
1
解决办法
147
查看次数

标签 统计

common-lisp ×4

lisp ×3

macros ×2

setf ×1

variable-assignment ×1