You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DrRacket BSL开发绘图应用时鼠标事件全部变为数字如何解决?

问题根因

你给鼠标事件处理函数定义的参数顺序不符合BSL on-mouse 规范,导致你拿到的第二个参数实际上是鼠标的x坐标数值,而不是事件类型字符串。

BSL的2htdp/universe库中,on-mouse绑定的处理函数必须遵循固定的参数顺序:
处理函数名 当前应用状态 鼠标x坐标 鼠标y坐标 事件类型
你定义的handle-mouse把事件类型放在了第二个参数位,自然会拿到数值类型的坐标,触发string=?的类型报错。你后续加的字符串判断直接过滤了所有有效逻辑,因为你永远不会在第二个参数位拿到事件字符串,所以程序没有任何响应。

同时你原有代码的button-down分支存在逻辑问题:直接返回了add-line生成的image类型结果,没有包装为你定义的AppState结构体,会导致后续状态处理完全异常,需要同步修正。

修正方案

调整handle-mouse的参数顺序,同时修正返回值为合法的AppState结构体即可,参考代码如下:

; 参数顺序调整为 应用状态 → x坐标 → y坐标 → 事件类型
(define (handle-mouse appstate x-mouse y-mouse mouse-event)
  (cond
    [(string=? mouse-event "button-down")
     ; 返回AppState结构体,保存当前画布、新建的待绘制线条
     (make-AppState (AppState-image appstate)
                    (make-Line (make-posn x-mouse y-mouse) (make-posn x-mouse y-mouse))
                    #t)]
    [(string=? mouse-event "drag")
     (move-end appstate x-mouse y-mouse)]
    [(string=? mouse-event "button-up")
     (add-line-to-canvas appstate)]
    [else appstate]))

小优化建议:你定义的AppState结构体第三个字段名称是无语义的boolean,建议修改为drawing?这类语义化名称,降低后续维护出错概率。

内容的提问来源于stack exchange,提问作者Carson_He

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:15:01