【问题标题】:Stream time: arity mismatch Error hits in Racket流时间:arity mismatch 球拍中的错误命中
【发布时间】:2016-01-20 20:53:52
【问题描述】:

我编写了这个程序,它使用宏 notapingnota 让我可以更轻松地定义注释和 ping 只压缩一行代码(以 ping 开头的代码)我将在评论部分的三行中执行的操作(通过扬声器发送)。

问题是这两个宏似乎不能一起工作,我得到了 arity mismatch 错误:

流时间: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)

【问题讨论】:

    标签: macros lisp racket type-mismatch


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2020-09-30
      • 2013-04-19
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多