流时间:arity不匹配在Racket中出现错误

时间:2016-01-20 20:53:52

标签: macros lisp racket type-mismatch

我编写了这个使用宏 nota ping nota 的程序,让我更容易定义一个笔记,并且 ping 只压缩一行代码(以ping开头的代码),我会在评论部分的三行中进行压缩(通过扬声器发送)。

问题是两个宏看起来不能一起工作,我得到了arity不匹配错误:

流时间:arity不匹配;  预期的参数数量与给定的数字不匹配   预期:0   给出:2   参数:    #    #

我尝试使用define和define-syntax,但它不起作用。

#lang racket

(provide (all-defined-out))

(require rsound)

(define-syntax-rule (nota x y)
  (define x
       (network ()
             [sunet <= sine-wave y]
             [out = (+ sunet)])))

(define-syntax-rule (ping y)
    (
     (signal-play y)
     (sleep 0.25)
     (stop)))

(nota E2 82)
(nota F#2 92)
(nota G2 98)
(nota A2 110)

(ping E2)
(ping F#2)
(ping E2)
(ping G2)
(ping E2)
(ping A2)

;(signal-play E2)
;(sleep 0.25)
;(stop)

;(signal-play F#2)
;(sleep 0.25)
;(stop)

;(signal-play G2)
;(sleep 0.25)
;(stop)

;(signal-play A2)
;(sleep 0.25)
;(stop)

1 个答案:

答案 0 :(得分:3)

ping缺少begin来对3种表单进行分组:

(define-syntax-rule (ping y)
  (begin
    (signal-play y)
    (sleep 0.25)
    (stop)))

然后宏步进器显示您的代码已扩展为

(define E2 (network () [sunet <= sine-wave 82] [out = (+ sunet)]))
(define F#2 (network () [sunet <= sine-wave 92] [out = (+ sunet)]))
(define G2 (network () [sunet <= sine-wave 98] [out = (+ sunet)]))
(define A2 (network () [sunet <= sine-wave 110] [out = (+ sunet)]))
(begin (signal-play E2) (sleep 0.25) (stop))
(begin (signal-play F#2) (sleep 0.25) (stop))
(begin (signal-play E2) (sleep 0.25) (stop))
(begin (signal-play G2) (sleep 0.25) (stop))
(begin (signal-play E2) (sleep 0.25) (stop))
(begin (signal-play A2) (sleep 0.25) (stop))))