Racket 中的 #:

本贴最后更新于 233 天前,其中的信息可能已经天翻地覆

在 Racket 中,#:​ 用于定义和使用关键字参数:

(define (func #:a a #:b b . @rest) (list a b rest)) (func #:a 1 #:b 2 #:c 3 #:d 4) ; 结果: (1 2 (#:c 3 #:d 4))
  1. 关键字参数 (#:​)

    在 Racket 中,#:​ 后跟一个标识符定义了一个关键字。这允许我们创建具名参数,使函数调用更清晰和灵活。

  2. 函数定义解析

    (define (func #:a a #:b b . @rest) ...)
    • #:a a​: 定义一个名为 a​ 的必需关键字参数
    • #:b b​: 定义另一个名为 b​ 的必需关键字参数
    • . @rest​: 使用点号 (.​) 和 @​ 符号来收集所有剩余的关键字参数
  3. 函数体

    (list a b rest)

    函数返回一个包含 a​、b​ 和 rest​ 的列表。

  4. 函数调用

    (func #:a 1 #:b 2 #:c 3 #:d 4)
    • #:a 1​: 为参数 a​ 提供值 1
    • #:b 2​: 为参数 b​ 提供值 2
    • #:c 3​ 和 #:d 4​: 这些是额外的关键字参数,会被收集到 rest​ 中
  5. 结果解释

    (1 2 (#:c 3 #:d 4))
    • 1​: 来自 a
    • 2​: 来自 b
    • (#:c 3 #:d 4)​: 剩余的关键字参数对,被收集到 rest​ 中
  6. @rest​ 的作用

    @​ 符号在这里用于收集剩余的关键字参数。它允许函数接受任意数量的额外关键字参数,而不需要预先定义它们。

  7. 关键字参数的优势

    • 命名清晰:参数的用途通过关键字明确表示
    • 顺序灵活:调用时可以以任意顺序提供关键字参数
    • 可选参数:可以轻松实现可选参数
    • 自文档化:函数签名本身就能表明参数的用途
  8. 使用场景

    关键字参数特别适用于具有多个可选配置的复杂函数,可以大大提高代码的可读性和灵活性。

示例扩展:

(define (advanced-func #:required req #:optional [opt 'default] . @rest) (list req opt rest)) (advanced-func #:required 'must #:optional 'custom #:extra 'bonus) ; 结果: (must custom (#:extra bonus)) (advanced-func #:required 'must) ; 结果: (must default ())

总结:
#:​ 在 Racket 中用于定义和使用关键字参数,这是一个强大的特性,可以创建更具表现力和灵活性的函数接口。它允许你创建具有命名参数、可选参数和可变数量参数的函数,同时保持调用语法的清晰和直观。这种方式特别适合创建具有复杂配置选项的 API 或库函数。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 22 关注
  • AWS
    11 引用 • 28 回帖 • 12 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 376 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 549 关注
  • OneNote
    1 引用 • 3 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 3 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 57 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 144 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 76 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 128 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 105 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 366 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 631 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 92 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 647 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖 • 2 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 518 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 830 关注