Lambda LISP宏失败,崩溃粘液

Lambda LISP宏失败,崩溃粘液,lambda,macros,lisp,common-lisp,slime,Lambda,Macros,Lisp,Common Lisp,Slime,我正在emacs中使用CommonLisp和slime,并试图定义一个简单的宏。但是,当我运行宏时,emacs slime缓冲区将变得无响应,我的计算机很快变得无法使用。即使在退出emacs之后,我也会在bash提示符处收到关于无法分配内存的错误消息 我想用我的宏来写这两个函数 (defun triad (foo scale) "Generates a triad on scale-step FOO of scale SCALE" (list (%part (- foo 1) scale

我正在emacs中使用CommonLisp和slime,并试图定义一个简单的宏。但是,当我运行宏时,emacs slime缓冲区将变得无响应,我的计算机很快变得无法使用。即使在退出emacs之后,我也会在bash提示符处收到关于无法分配内存的错误消息

我想用我的宏来写这两个函数

(defun triad (foo scale)
  "Generates a triad on scale-step FOO of scale SCALE"
  (list (%part (- foo 1) scale)
    (%part (+ foo 1) scale)
    (%part (+ foo 3) scale)))

(defun quad (foo scale)
  "Generates a quad on scale step FOO of scale SCALE"
  (list (%part (- foo 1) scale)
    (%part (+ foo 1) scale)
    (%part (+ foo 3) scale)
    (%part (+ foo 5) scale)))
使用如下语法

(defchord 'mtriad '(1 3 5))
(defchord 'mquad  '(1 3 5 7))
我决定使用mapcar和lambda函数来生成我想要的输出。在解释器中,这可以生成我想要的:

CL-USER> (mapcar (lambda (x) `(%part (+ ,x 2) scale)) '(1 3 5))
((%PART (+ 1 2) SCALE) (%PART (+ 3 2) SCALE) (%PART (+ 5 2) SCALE))
但是,当我试图将其放入宏中以生成defun调用时,它会使slime崩溃,并在我调用它时立即杀死我的内存:

(defmacro defchord (name steps)
  `(defun ,name (foo scale)
     (quote ,(mapcar (lambda (x) `(%part (+ ,x 2) scale)) steps))))

我希望这是一个简单的新手错误

以下是我对宏的实现,该宏生成您最初列出的函数:

(defmacro defchord (name steps)
  `(defun ,name (foo scale)
     ,(concatenate 'string "Generates a " (symbol-name name) " on scale-step FOO of scale SCALE")
     (list ,.(mapcar (lambda (i) `(%part (+ foo ,i) scale)) steps))))
一些例子:

> (macroexpand-1 '(defchord triad (-1 1 3)))
(DEFUN TRIAD (FOO SCALE)
  "Generates a TRIAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE)))

> (macroexpand-1 '(defchord quad (-1 1 3 5)))
(DEFUN QUAD (FOO SCALE)
  "Generates a QUAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE) (%PART (+ FOO 5) SCALE)))

我认为这与您列出的函数非常匹配。:-)

以下是我对宏的实现,该宏生成您最初列出的函数:

(defmacro defchord (name steps)
  `(defun ,name (foo scale)
     ,(concatenate 'string "Generates a " (symbol-name name) " on scale-step FOO of scale SCALE")
     (list ,.(mapcar (lambda (i) `(%part (+ foo ,i) scale)) steps))))
一些例子:

> (macroexpand-1 '(defchord triad (-1 1 3)))
(DEFUN TRIAD (FOO SCALE)
  "Generates a TRIAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE)))

> (macroexpand-1 '(defchord quad (-1 1 3 5)))
(DEFUN QUAD (FOO SCALE)
  "Generates a QUAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE) (%PART (+ FOO 5) SCALE)))

我认为这与您列出的函数非常匹配。:-)

以下是我对宏的实现,该宏生成您最初列出的函数:

(defmacro defchord (name steps)
  `(defun ,name (foo scale)
     ,(concatenate 'string "Generates a " (symbol-name name) " on scale-step FOO of scale SCALE")
     (list ,.(mapcar (lambda (i) `(%part (+ foo ,i) scale)) steps))))
一些例子:

> (macroexpand-1 '(defchord triad (-1 1 3)))
(DEFUN TRIAD (FOO SCALE)
  "Generates a TRIAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE)))

> (macroexpand-1 '(defchord quad (-1 1 3 5)))
(DEFUN QUAD (FOO SCALE)
  "Generates a QUAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE) (%PART (+ FOO 5) SCALE)))

我认为这与您列出的函数非常匹配。:-)

以下是我对宏的实现,该宏生成您最初列出的函数:

(defmacro defchord (name steps)
  `(defun ,name (foo scale)
     ,(concatenate 'string "Generates a " (symbol-name name) " on scale-step FOO of scale SCALE")
     (list ,.(mapcar (lambda (i) `(%part (+ foo ,i) scale)) steps))))
一些例子:

> (macroexpand-1 '(defchord triad (-1 1 3)))
(DEFUN TRIAD (FOO SCALE)
  "Generates a TRIAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE)))

> (macroexpand-1 '(defchord quad (-1 1 3 5)))
(DEFUN QUAD (FOO SCALE)
  "Generates a QUAD on scale-step FOO of scale SCALE"
  (LIST (%PART (+ FOO -1) SCALE) (%PART (+ FOO 1) SCALE)
        (%PART (+ FOO 3) SCALE) (%PART (+ FOO 5) SCALE)))

我认为这与您列出的函数非常匹配。:-)

您引用的是内部引号,您引用的参数就像它们是函数一样。如果可以接受,您可以将其作为一个函数:

(defun defchord (name steps)
  (setf (symbol-function name)
        (lambda (foo scale) 
          (mapcar (lambda (step) 
                    (%part (+ foo step) scale))
                  steps)))
  name)

;; test
(defchord 'mtriad '(1 3 5)) ;==> mtriad
(defun %part (x y) (cons x y))
(mtriad 2 10) ; ==> ((3 . 10) (5 . 10) (7 . 10))

您引用的是内部引号,您引用的参数就像它们是函数一样。如果可以接受,您可以将其作为一个函数:

(defun defchord (name steps)
  (setf (symbol-function name)
        (lambda (foo scale) 
          (mapcar (lambda (step) 
                    (%part (+ foo step) scale))
                  steps)))
  name)

;; test
(defchord 'mtriad '(1 3 5)) ;==> mtriad
(defun %part (x y) (cons x y))
(mtriad 2 10) ; ==> ((3 . 10) (5 . 10) (7 . 10))

您引用的是内部引号,您引用的参数就像它们是函数一样。如果可以接受,您可以将其作为一个函数:

(defun defchord (name steps)
  (setf (symbol-function name)
        (lambda (foo scale) 
          (mapcar (lambda (step) 
                    (%part (+ foo step) scale))
                  steps)))
  name)

;; test
(defchord 'mtriad '(1 3 5)) ;==> mtriad
(defun %part (x y) (cons x y))
(mtriad 2 10) ; ==> ((3 . 10) (5 . 10) (7 . 10))

您引用的是内部引号,您引用的参数就像它们是函数一样。如果可以接受,您可以将其作为一个函数:

(defun defchord (name steps)
  (setf (symbol-function name)
        (lambda (foo scale) 
          (mapcar (lambda (step) 
                    (%part (+ foo step) scale))
                  steps)))
  name)

;; test
(defchord 'mtriad '(1 3 5)) ;==> mtriad
(defun %part (x y) (cons x y))
(mtriad 2 10) ; ==> ((3 . 10) (5 . 10) (7 . 10))

谢谢你的帮助。在引号内引用是不是不合适?@jimpudar当你引用某物时,
'mtriad
,这与写
(quote mtriad)
是一样的。宏不会计算它的参数,所以您的参数是一个包含两个符号的列表
quote
mtriad
,以及如何使用该列表作为名称:
(defun(quote mtriad)(foo scale)
)。你的宏体使用quoasiquoting,里面使用quote。谢谢你的帮助。在引号内引用是不是不合适?@jimpudar当你引用某物时,
'mtriad
,这与写
(quote mtriad)
是一样的。宏不会计算它的参数,所以您的参数是一个包含两个符号的列表
quote
mtriad
,以及如何使用该列表作为名称:
(defun(quote mtriad)(foo scale)
)。你的宏体使用quoasiquoting,里面使用quote。谢谢你的帮助。在引号内引用是不是不合适?@jimpudar当你引用某物时,
'mtriad
,这与写
(quote mtriad)
是一样的。宏不会计算它的参数,所以您的参数是一个包含两个符号的列表
quote
mtriad
,以及如何使用该列表作为名称:
(defun(quote mtriad)(foo scale)
)。你的宏体使用quoasiquoting,里面使用quote。谢谢你的帮助。在引号内引用是不是不合适?@jimpudar当你引用某物时,
'mtriad
,这与写
(quote mtriad)
是一样的。宏不会计算它的参数,所以您的参数是一个包含两个符号的列表
quote
mtriad
,以及如何使用该列表作为名称:
(defun(quote mtriad)(foo scale)
)。你的宏体使用quoasiquoting,内部使用quote。很漂亮,这正是我需要的。mapcar之前的周期是什么?我注意到在这里引用内部引文很有效,尽管另一张海报似乎暗示这是我的原版<代码>,.是
,@
(无报价拼接)的非考虑性版本。它用于新创建的列表(例如在本例中由
mapcar
),您知道这些列表可以就地修改。如果有疑问,只需使用始终安全的
,@
。2.不,你仍然不能在这里使用引号,特别是,你不能真正引用
三元组
四元组
或步骤列表。很好,这正是我需要的。mapcar之前的周期是什么?我注意到在这里引用内部引文很有效,尽管另一张海报似乎暗示这是我的原版<代码>,.是
,@
(无报价拼接)的非考虑性版本。它用于新创建的列表(例如在本例中由
mapcar
),您知道这些列表可以就地修改。如果有疑问,只需使用始终安全的
,@
。2.不,你仍然不能在这里使用引号,特别是,你不能真正引用
三元组
四元组
或步骤列表。很好,这正是我需要的。mapcar之前的周期是什么?我注意到在这里引用内部引文很有效,尽管另一张海报似乎暗示这是我的原版<代码>,.是
,@
(无报价拼接)的非考虑性版本。它用于新创建的列表(例如在本例中由
mapcar
),您知道这些列表可以就地修改。如果有疑问,只需使用始终安全的
,@
。2.不,你仍然不能在这里使用引号,特别是,你不能真正引用
三元组
四元组
或步骤列表。很好,这正是我需要的。什么没有