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

如何改写Racket的case-lambda函数以支持关键字参数

解决Racket中case-lambda结合关键字参数的问题

Racket的case-lambda确实不支持直接匹配关键字参数分支,要保留原有位置参数的处理逻辑同时支持#:pref关键字调用,可以改用可变参数结合模式匹配的方式实现:

方案代码

(define (greet-weightlifter . args)
  (match args
    ; 处理两个位置参数的情况
    [(list nombre nombre-segundo)
     (string-append "Hola, " nombre " " nombre-segundo ".")]
    ; 处理单个位置参数的情况
    [(list name)
     (string-append "Hi, " name ".")]
    ; 处理 #:pref 关键字参数的情况
    [(list '#:pref p)
     (string-append "Hi, would you do a " p " for me, my gentle athlete?")]
    ; 非法参数处理
    [_ (error "Invalid argument combination for greet-weightlifter")]))

测试调用

(greet-weightlifter "Vanessa" "Lizárraga")
; 输出:"Hola, Vanessa Lizárraga."

(greet-weightlifter "Busra")
; 输出:"Hi, Busra."

(greet-weightlifter #:pref "squat")
; 输出:"Hi, would you do a squat for me, my gentle athlete?"

原理说明

通过定义接收可变参数的函数,利用match表达式匹配不同的参数组合:

  • 匹配两个普通位置参数时,执行原有的西班牙语问候逻辑
  • 匹配单个普通位置参数时,执行原有的英语问候逻辑
  • 匹配#:pref关键字加参数的组合时,执行对应的请求逻辑
  • 其他参数组合则抛出错误提示

这种方式既完全保留了原case-lambda的位置参数处理逻辑,又实现了关键字参数的支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:37:03