创建后缀号码球拍

2024-04-20

我正在尝试在 Racket 中试验我可以做的事情,并且我想在数字后加上字母。

对于这个例子,我只想代表10000 as 10K, and 1000000 as 1M.

有没有办法(用宏或其他方式)我可以扩展1M to:

(* 1 1000000)

或者有什么效果?


在球拍中,类似的东西10K are 身份标识,通常指的是变量。有两种方法可以将它们变成数字:

1:重新定义“未定义”标识符的含义

您可以通过定义一个未定义的标识符来重新定义要执行的操作#%top macro.

#lang racket
(require syntax/parse/define
         (only-in racket [#%top old-#%top]))

(define-syntax-parser #%top
  [(_ . x:id)
   #:when (id-has-a-k-at-the-end? #'x)
   (transform-id-into-number #'x)]
  [(_ . x)
   #'(old-#%top . x)])

然而,这有一个微妙的问题。如果程序中存在任何以 K 结尾的标识符或变量,它们可能会覆盖以这种方式编写的任何数字。您需要小心,不要意外覆盖原本应该是数字的内容。

2:制作一个阅读器扩展,将它们转换为数字而不是标识符

这将花费更多时间,但它更接近执行此操作的“正确方法”,因为它可以避免当变量末尾恰好有 K 时发生冲突。

扩展读者的更简单的方法之一是使用可读表 https://docs.racket-lang.org/reference/readtables.html?q=read-syntax%2Frecu。您可以创建一个扩展可读表的函数,如下所示:

;; Readtable -> Readtable
(define (extend-readtable orig-rt)
  ;; Char InputPort Any Nat Nat Nat -> Any
  (define (rt-proc char in src ln col pos)
    ....)
  ...
  (make-readtable orig-rt
    #f 'non-terminating-macro rt-proc
    ...))

要使用它来定义#lang语言,您需要将阅读器实现放入your-language/lang/reader.rkt。这就是number-with-k/lang/reader.rkt,其中number-with-k目录作为单个集合包安装(raco pkg install path/to/number-with-k).

带 k 的数字/lang/reader.rkt

#lang racket

(provide (rename-out [-read read]
                     [-read-syntax read-syntax]
                     [-get-info get-info]))

(require syntax/readerr
         syntax/module-reader)

;; Readtable -> Readtable
(define (extend-readtable orig-rt)
  ;; Char InputPort Any Nat Nat Nat -> Any
  (define (rt-proc char in src ln col pos)
    ....)
  ...
  (make-readtable orig-rt
    #f 'non-terminating-macro rt-proc))

;; [X ... -> Y] -> [X ... -> Y]
(define ((wrap-reader rd) . args)
  (parameterize ([current-readtable (extend-readtable (current-readtable))])
    (apply rd args)))

(define-values [-read -read-syntax -get-info]
  (make-meta-reader 'number-with-k
                    "language path"
                    lang-reader-module-paths
                    wrap-reader
                    wrap-reader
                    identity))

主要工作是填写....中的洞extend-readtable功能。例如,您可以让它识别以结尾的标识符K像这样:

;; Readtable -> Readtable
(define (extend-readtable orig-rt)
  ;; Char InputPort Any Nat Nat Nat -> Any
  (define (rt-proc char in src ln col pos)
    (define v (read-syntax/recursive src in char orig-rt #f))
    (cond
      [(and (identifier? v) (id-has-a-k-at-the-end? v))
       (transform-id-into-number v)]
      [else
       v]))

  (make-readtable orig-rt
    #f 'non-terminating-macro rt-proc))

完成此操作后,您就拥有了number-with-k作为包安装的目录,您应该能够使用#lang number-with-k像这样:

#lang number-with-k racket

(+ 12K 15)
; => 12015
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建后缀号码球拍 的相关文章

随机推荐

  • 列表或元组的成对遍历

    a 5 66 7 8 9 是否可以进行迭代而不是这样写 a 1 a 0 a 2 a 1 a 3 a 2 a 4 a 3 谢谢你 用起来没问题range 然而 编程 如数学 是建立在抽象之上的 连续对 x0 x1 x1 x2 xn 2 xn
  • 我应该使用“| at now”还是与号(&)在后台运行脚本?

    我一直在查看有关在后台运行 php 脚本的答案 它们似乎以两种方式传播 有些人建议使用这个 或类似的东西 usr bin php command gt dev null 2 gt 1 其他建议使用 at 命令 echo usr bin ph
  • 使用 github 操作缓存 npm 依赖项

    我想缓存 npm 依赖项 这样我就不会每次推送时都执行 npm install 而是从缓存加载它 我认为 github action 现在支持这个了吗 如何缓存 GitHub 操作中的步骤 https stackoverflow com q
  • 如果阈值不够好,如何检测 opencv (c++) 中的异常?

    我有这样的灰度图像 I want to detect anomalies on this kind of images On the first image upper left I want to detect three dots on
  • ASP.NET MVC 3 OnActionExecuting 导致无限循环

    我有重写的 OnActionExecuting 方法 如果用户登录 则在操作执行之前检查 public class AuthenticationAttribute ActionFilterAttribute public override
  • 在设计时获取文件的相对路径

    我正在构建一个 Windows Phone 8 应用程序 在设计时 我加载示例 XML 文件来获取示例数据 它运行良好 但我想使用相对于解决方案根目录的文件路径 以便它可以适用于具有相同代码的所有开发人员 这是我当前的代码 var path
  • 是否可以在 Golang 中创建类型通用(模板)函数

    我是新手 只是玩玩它 但我已经编写了一个命令行工具 我调用了大约 30 个不同的函数return x err 在每种情况下 如果出现错误 我想做的只是恐慌 基本上一切都完美运行 或者整个事情都失败了 我知道有template Must t
  • 底部渐变边框

    根据CSS 技巧 http css tricks com examples GradientBorder 以下 CSS 语法将导致左边框渐变 left to right border width 3px 0 3px 3px webkit b
  • “gcloud deploy”抱怨同时拥有 .gcloudignore 和skip_files,尽管我两者都没有

    我正在尝试将 Django v2 1 应用程序部署到 App Engines Python37 运行时 这是我的app yaml这是取自谷歌示例 https github com GoogleCloudPlatform python doc
  • 自定义 Applescript 应用程序图标

    我已经创建了我的苹果脚本 https en wikipedia org wiki AppleScript 对其进行了测试 将其另存为 app 并且可以正常工作 现在 如何为其设置自定义图标 我做了一些谷歌搜索并尝试了一些不同的事情 但无法让
  • ionic-Angular Components.core.scss 错误

    刚从 Ionic 2 开始 我的第一个应用程序失败并出现错误 错误 导入指令不能在控制指令或混合中使用 在node modules ionic angular components core scss的第34行 import 字体 离子图标
  • 如何从数据库获取连接字符串

    我已经使用 SQL Server Management Studio 创建了一个数据库 现在我想在我的 C 应用程序中使用它 我需要连接字符串吗 我在哪里可以找到连接字符串 我的数据库存储在哪里 我是否必须发布它或类似的东西 或者它在我的文
  • PHP __halt_compiler 未找到

    我正在使用 PHP 5 6 运行本地服务器 我正在使用使用该函数的第三方库 halt compiler 一旦达到此功能 我会收到以下错误 PHP 致命错误 未捕获异常 UnexpectedValueException 消息 phar 内部损
  • 从 URL 解析域

    我需要构建一个从 URL 解析域的函数 So with http google com dhasjkdas sadsdds sdda sdads html or http www google com dhasjkdas sadsdds s
  • 在打字稿中扩展角度全局对象

    我正在使用 Angularjs 和 Typescript 我想使用如下自定义函数来扩展 Angular 对象 angular executeAfterDigest function 我该如何去做这件事呢 我怀疑我需要以某种方式扩展 IAng
  • Omnipay 如何添加新网关

    有谁知道如何向 Omnipay 添加新的支付网关 我读了博客https groups google com forum topic omnipay j7OeQQSB95A https groups google com forum topi
  • Xcode 找不到 cstddef

    由于某种原因 Xcode iOS 无法找到我正在使用的库 Boost 的 cstddef 有谁知道如何解决这一问题 我正在 Mac OS X 10 8 下使用 Xcode 4 6 进行编译 你应该让你的项目全部为 Objective C 将
  • 如何处理Android应用程序中标记的双击

    我在地图上显示车辆 当我单击车辆时 它会显示信息窗口 但我需要双击车辆 然后它会转到新页面 我不知道该怎么做 请帮助我 这是我的代码 public class MapsActivity extends FragmentActivity im
  • 如何将其制作为左/右滑动 div

    下面提供的是我的 html 和 css 代码的片段 我不仅需要在 html 和 css 中添加 而且还需要在 javascript 中添加什么 才能使其以滑入 滑出的方式工作 向右打开 和 左关闭 div div a href Edit P
  • 创建后缀号码球拍

    我正在尝试在 Racket 中试验我可以做的事情 并且我想在数字后加上字母 对于这个例子 我只想代表10000 as 10K and 1000000 as 1M 有没有办法 用宏或其他方式 我可以扩展1M to 1 1000000 或者有什