- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直致力于将我用 Python 编写的静态站点生成器转换为 Racket。这主要是为了更好地了解 Racket 的学习练习。我现在可以使用 Racket 版本,但有一点我更喜欢 Python 版本:pathlib.Path
对象。生成器有很多路径处理,在 Python 代码中看起来是这样的:
render_template(root / "templates" / "index.jinja")
而 Racket 代码看起来更像这样:
(render-template (build-path (root) "templates" "index.jinja"))
我发现在 Python 代码中读取路径的能力更清晰,所以我想修改 Racket 阅读器以支持如下内容:
(render-template (root) / "templates" / "index.jinja")
和读者一起玩,我想出了如何让这种表达起作用:
(render-template / foo / templates / index.jinja /)
我可以接受语法,但我不知道如何将路径元素作为 Racket 表达式求值,而不仅仅是字符串。即使我确实弄清楚了,我仍然有一个问题,即简单的字符串处理会导致类似以下问题:
(render-template / (root) / (string-join
(list "templates" "subdir") "/")
/ "index.jinja" /)
那么,关于我在这里可以做什么,有什么建议/意见吗? :)
最佳答案
如果我没理解错的话,原来你有这样的东西:
(define (root)
"/")
(define (render-template path)
(displayln path))
(render-template (build-path (root) "templates" "index.jinja"))
;; => /templates/index.jinja
我的建议是简单地改变 render-template
这样它就可以用多个路径“部分”调用——它处理调用build-path
给你:
(define (render-template . path-parts)
(define path (apply build-path path-parts))
(displayln path))
现在你可以这样调用它:
(render-template (root) "templates" "index.jinja")
;; => /templates/index.jinja
顺便说一句,原来的方式仍然有效,因为build-path
在这种情况下将充当标识:
(render-template (build-path (root) "templates" "index.jinja"))
;; => /templates/index.jinja
我认为这是最“骚”的方式。关于一件好事s-expressions 是您不必键入“分隔符”,如 、
或 /
。空格就够了。而且我认为你阅读和编写 Racket 代码的次数越多,你越会有这种感觉。
诚然,也许最令人不安的事情就是能够你自己的小(或大)语言。如果你想要一个“DSL”来写主要由路径组成的文件,这可能是一回事。但在在这种情况下,我不确定我是否看到了巨大的胜利。
如果有的话,也许您只需要一个宏这使得 /
在此上下文中充当空格。即到使 /
在扩展代码中意味着它最终需要成为的“无”。
例如:
#lang racket/base
(require (for-syntax racket/base syntax/parse))
(define-syntax (render-template stx)
(define-splicing-syntax-class pp
(pattern (~seq part (~optional (~literal /)))))
(syntax-parse stx
[(_ p:pp ...) #'(do-render-template p.part ...)]))
(define (do-render-template . path-parts)
(define path (apply build-path path-parts))
(displayln path))
(render-template (root) / "templates" / "index.jinja")
;; => /templates/index.jinja
(render-template (root) "templates" "index.jinja")
;; => /templates/index.jinja
请注意,/
在这里是完全可选的。他们被视为空格。
另请注意,真正的工作是在函数中完成的,现在重命名为 do-render-template
。宏只是一个包装器。一般来说,宏最好尽可能少地做必要的工作,可以是函数的东西最好是函数。
但同样,我个人不会为宏而烦恼,我会采用上面建议的方法。
更新:附言,如果我理解正确,Python 的PathLib.Path
将/
定义为运算符?好吧,Racket 并没有真正的“运营商”。它有功能。像 /
这样的数学函数接受任意数量的参数。因此,我们编写 (/10 5 2)
而不是 10/5/2
。实际上,这让我们绕了一圈又回到了 build-path
:一个包含任意数量路径部分的函数。
我想您可以有效地将 build-path
重命名为 /
:
(require (rename-in (except-in racket /)
[build-path /]))
(/ (root) "templates" "index.jinja")
但这并不是真正的运算符重载,因为它们是普通函数而不是方法。而且……我不会那样做。 :)
关于racket - 如何扩展 Racket 的阅读器以获得更好的路径处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462913/
我意识到“强类型”和“软类型”的定义是松散且易于解释的,但我还没有找到关于无类型 Racket (根据我的理解意味着动态类型)和类型 Racket 的明确定义。 再一次,我确定它不是那么简单和干燥,但
我来自 Java 和 Python,很难理解面向对象代码在 Racket 中的工作方式。 给定 (define food% (class object% (super-new) (i
我安装了 Sublime Text - Racket Package,但没有用。出现此错误。我该怎么办。 [Errno 2] No such file or directory: 'racke
.rkt是“常规”Racket 源代码的常规文件扩展名。在文档中,我还看到了 .rktl 和 .rkts 正在使用。什么是.rktl和 .rkts用于,还有我不知道的更多 Racket 文件扩展名吗?
假设我为具有“中心”的集合定义了一个结构体。 (struct centered-set (center elems)) 我想保证以下条件。 elems是一个集合。 center是 elems 的成员(
我想要一个函数,它接受一个字符串,由一个 python 格式的树组成,就像这样 "[0, [1, 0]]" 并输出一个可用的 Racket 列表,像这样 '(0 (1 0)) 我的第一步是将字符串转换
是否有 Racket 内置函数列表?我正在寻找类似 this one 的列表对于 python 。我似乎无法在文档中找到一个。 最佳答案 这里有一些列表: Racket文档中所有函数的索引: http
虽然 Racket 允许创建 GUI 应用程序(甚至游戏),但我想知道它是否适合与 Things 一样在视觉上发布商业应用程序或 OmniOutliner .这样的应用程序会感觉原生还是看起来像一个不
和node的npm一样,我们使用package.json来解决依赖。 我试过raco pkg,它似乎只是一种开发/发布包的方式,而不是解决外部依赖。 最佳答案 如上所述,Racket 中的 info.
我是 Racket 的新手,尽管到目前为止我已经设法使用 servlet 并让一些东西发挥作用。我现在想做的是验证一个简单的用户名/密码 POST 请求。我已经通过“web-server/formle
我正在为现场编码表演创建一个程序,为此我需要一个基本的 S 表达式代码编辑器(我输入的内容将在适当的语法上下文中评估为 Racket 代码)。 由于 DrRacket 本身是用 Racket 编写的,
和node的npm一样,我们使用package.json来解决依赖。 我试过raco pkg,它似乎只是一种开发/发布包的方式,而不是解决外部依赖。 最佳答案 如上所述,Racket 中的 info.
我正在尝试在 Racket 中编写模块元语言 mylang ,它接受将修改后的主体传递给的第二种语言,例如: (module foo mylang typed/racket body) 相当于: (m
我没有运气找到一种方法来按照我想要的方式进行这项工作,所以如果有人能提供帮助,我将不胜感激。 我想要的是能够在终端上做到这一点: > racket 然后能够输入 Racket 命令并让它们编译。像,
我来自 Java 世界,对 Racket 充满热情。 想知道类似Maven的工具在哪里。如果你不熟悉Maven,还有Scala中的SBT,Android中的gradle,Elixir中的mix等,作为
在 typed/racket 我有一个像 [(? procedure? p ) (apply p xv*)]会导致错误: Type Checker: Function has no cases in:
我是 Lisp-scheme 的新手,对整个函数范式还很陌生,我目前正在做一个任务,要求我重载一个名称相同但参数集不同的函数 racket .下面是我试图实现的一个例子: #lang racket (
有没有办法在 Racket 中获取对象的唯一标识符?例如,当我们使用 Racket 的 eq?运算符来检查两个变量是否指向同一个对象,它使用什么标识符来实现这种比较? 我正在寻找类似 python 的
当我在 Dr. Racket 或从命令行运行我的测试时,失败的测试总是在一行上。 例如, (bad (interp-t-prog (list '(class posn extends object (
我有以下代码: (plot (function sin (- pi) pi #:label "y = sin(x)")) 但是在解决 SICP 时我没有遇到这样的结构:#:label "y = sin
我是一名优秀的程序员,十分优秀!