(Chez) 用于隐藏 lambda 的方案宏

2024-04-04

我想编写一个宏来创建速记语法来隐藏更详细的 lambda 表达式,但我很难理解如何编写宏(我意识到这是反对使用它们的一个论据)。

给出这个例子:

(define alist-example
  '((x 1 2 3) (y 4 5 6) (z 7 8 9)))

(define ($ alist name)
  (cdr (assoc name alist)))

((lambda (a) (map (lambda (x y z) (+ x y z)) ($ a 'x) ($ a 'y) ($ a 'z))) alist-example)
((lambda (a) (map (lambda (y) (/ y (apply max ($ a 'y)))) ($ a 'y))) alist-example)

我想写一个宏with-alist,这将允许我编写与此类似的最后两个表达式:

(with-alist alist-example (+ x y z))
(with-alist alist-example (/ y (apply max y)))

有什么意见或建议吗?


这里有一个syntax-rules基于我在其他答案和评论中收到的反馈的解决方案:

(define ($ alist name)
  (cdr (assoc name alist)))

(define-syntax with-alist
  (syntax-rules ()
    [(_ alist names expr)
     (let ([alist-local alist])
       (apply map (lambda names expr)
              (map (lambda (name) ($ alist-local name)) (quote names))))]))

以下是一些用法示例:

> (define alist-example
  '((x 1 2 3) (y 4 5 6) (z 7 8 9)))
> (with-alist alist-example (x) (+ x 2))
(3 4 5)
> (with-alist alist-example (x y) (+ x y))
(5 7 9)
> (with-alist alist-example (x y z) (+ x y z))          
(12 15 18)

这个答案不足以解决更复杂的例子,(with-alist alist-example (/ y (apply max y))),在我的问题中,但我认为这对于我的目的来说是一个合理的方法:

> (with-alist alist-example (y) (/ y (apply max ($ alist-example 'y))))
(2/3 5/6 1)

编辑:经过一些额外的修改,我得出了一个稍微不同的解决方案,我认为它将提供更大的灵活性。

我的新宏,npl,将速记表达式扩展为名称和过程的列表。

(define-syntax npl
  (syntax-rules ()
    [(_ (names expr) ...)
     (list 
      (list (quote names) ...)
      (list (lambda names expr) ...))]))

该宏的输出被传递给常规过程,with-list-map,其中包含了大部分核心功能with-alist上面的宏。

(define (with-alist-map alist names-proc-list)
  (let ([names-list (car names-proc-list)]
        [proc-list (cadr names-proc-list)])
    (map (lambda (names proc)
           (apply map proc
                  (map (lambda (name) ($ alist name)) names)))
         names-list proc-list)))

3个例子with-alist上面的用法可以在一次调用中捕获with-alist-map.

> (with-alist-map alist-example
                (npl ((x) (+ x 2))
                     ((x y) (+ x y))
                     ((x y z) (+ x y z))))
((3 4 5) (5 7 9) (12 15 18))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Chez) 用于隐藏 lambda 的方案宏 的相关文章

随机推荐

  • 使用 gdi+ 将 png 转换为 gif (C#)

    我有一个 png 文件 必须将其转换为 gif 文件 里面有一个透明的部分 当我保存它时 透明的部分是黑色的而不是透明的 这是我的代码 FileStream imgStream new FileStream outputFile FileM
  • 关于Python中的关闭文件

    我知道如果在 Python 中不再使用的话 使用 close 来关闭文件是一个好习惯 我尝试打开大量打开的文件 并且不关闭它们 在同一个Python进程中 但没有看到任何异常或错误 Mac 和 Linux 我都试过了 那么 只是想知道Pyt
  • 如何根据当前用户的角色显示或隐藏 aspx 页面的内容

    我有一个 ASP NET 站点 其中每个页面都有一些内容 每个登录用户都有一些特定的角色 我想根据登录用户的角色隐藏和显示页面内容 我怎样才能做到这一点 P S 我了解 ASP NET 中整个表单的身份验证和授权 我的问题是关于页面的内容
  • 如何在Rcpp代码中返回R的NULL?

    假设我有一个 C 代码要使用 Rcpp 编译 并将在 R 中调用 Rcpp export SEXP to env List x if x hasAttribute names return x else return NULL 应该做什么N
  • 在 Android 中集成 Google Plus 时,SERVICE_VERSION_UPDATE_REQUIRED 和 Google Play 服务已过时

    我已经在 Android 应用程序中集成了 Google Plus 我使用的是 Android SDK 版本 4 2 2 但我在 google plus 上执行共享帖子时遇到此错误 Google Plus 服务已过时 and Connect
  • 检查 Python 列表中的项目是否为 int/number

    我有一个 Python 脚本 它读取 csv 文件并将每个值存储到列表列表中 list x y 我对此没有任何问题 list i 0 for row in reader list append list i append row 0 i 1
  • 为什么 std::search 需要前向迭代

    我的问题与下面的线程相同 我正在努力理解给出的答案 或者更确切地说 我的代码不应该工作 因为它只使用输入迭代器 但我的 func 似乎工作并且行为与 std search 相同 所以我不知所措 不愿意在没有正确理解的情况下继续前进 也许如果
  • Ruby 中 <

    我正在学习Ruby 在我使用的书中 有这样的示例代码 restaurant Restaurant new restaurant name Mediterrano restaurant description lt
  • 为什么我的 g++ 和 gcc 版本没有升级?

    我在 Mac 上 我将 OSx 更新到 Yosemite 我将 xcode 更新到版本 6 我下载了命令行工具 尽管如此 每当我输入 g version 时 我都会得到 g version couldn t understand kern
  • 调用 Activity 加载方法,Android [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在活动加载后立即调用一个方法 该方法是公共无效的 任何帮助 将不胜感激 您可以使用以下方法 您可以在活动启动时在其中任何一个方法之间调
  • aws s3 ls 给出错误 botocore.utils.BadIMDSRequestError:

    最近我按照aws官方网站的文档在Linux机器上安装了aws cli 第一次 我能够毫无问题地运行 s3 命 令 作为开发的一部分 我卸载了 aws cli 并重新安装了它 我收到错误 botocore utils BadIMDSReque
  • 在 IPython 中导入时的最佳实践

    我正在编写一个 py 文件 该文件将在第一个单元格中的一些 IPython 会话开始时定期导入 但也将从其他非交互式会话导入 因为它包含可以在非交互式环境中批量运行的函数 交互模式 它基本上是一个包含许多非常常见的类和函数的模块 因为我使用
  • Microsoft Reporting v.10 加载问题

    我正在尝试在我的 vs studio 网站中引用 microsoft reporting v 10 0 0 0 由于某种原因 它无法实现这一点 因为它总是给我一个编译错误 表明它无法加载类型 错误 2625 无法从程序集 Microsoft
  • 在 iPhone 应用程序中创建下拉列表

    当我单击带有箭头符号的按钮时 可用项目列表应显示为列表 谁能帮助我编写为 iPhone 应用程序开发此代码的代码 UIPickerView 是正确的控件 是 iOS 用户期望的控件 也是 Apple iOS 人机界面指南指定的控件 即使在
  • 具有伴生对象的类与同名的类和对象有什么区别?

    Scala 类的 伴生对象 可以被视为具有与该类相同的完全限定名称的单例对象 即相同的名称 在同一包中 它们用于保存类的所有实例共有的实用函数 作为 Java 的替代品static方法 然而 在文档和问题的不同地方 它说伴生对象必须在同一编
  • 如何检测同一键盘按键仅按下一次

    我正在设计一个键盘类 它只能检测一次键盘按键 但我仍然不知道如何做到这一点 我的目标是仅检查并在持续按下或保持按住同一键时仅执行一次操作 并且当同时按下 2 个操作键时不执行任何操作 例如 当我持续按住 A 键时 操作 1 只会执行一次 然
  • OpenCv错误无法通过视频采集打开相机

    我通过 opencv 使用相机 重新启动后突然运行我的代码 它显示以下错误 WARN 0 global io opencv modules videoio src cap v4l cpp 802 open VIDEOIO ERROR V4L
  • 将参考 SVG 图像嵌入 HTML 文件

    我有一个项目 我想将简单的图形背景放入表格单元格中 背景图像和一个小的 svg 文件效果很好 但我真的很想将源代码全部保存在一个文件中 也就是说 我希望能够在 HEAD 中定义图像 并在内联 STYLE css 中引用它 我已经尝试了 sv
  • JAXBElement.getValue() 返回 null

    我的 Pojo 类中有一对多映射 一家店有一家分店 一个分店有很多家店铺 这是商店代码 XmlAccessorType XmlAccessType FIELD XmlRootElement name Shop public class Sh
  • (Chez) 用于隐藏 lambda 的方案宏

    我想编写一个宏来创建速记语法来隐藏更详细的 lambda 表达式 但我很难理解如何编写宏 我意识到这是反对使用它们的一个论据 给出这个例子 define alist example x 1 2 3 y 4 5 6 z 7 8 9 defin