作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如何在 Racket 中实现 cadr、caddr 等的可变版本,而不需要单独定义每个版本? IE。不
(define (mcadr exp)
(mcar (mcdr exp)))
对于可变列表或对,Racket 似乎仅支持 mcar 和 mcdr,但不支持“扩展”版本。我需要了解并擅长宏才能做到这一点吗?
最佳答案
这是一个宏解决方案:
#lang racket/base
(require racket/mpair (for-syntax racket/base))
(define-syntax (define-combinations stx)
(syntax-case stx ()
[(_ n) (integer? (syntax-e #'n))
(let ([n (syntax-e #'n)])
(define options (list (cons "a" #'mcar) (cons "d" #'mcdr)))
(define (add-options r)
(apply append
(map (λ (opt)
(map (λ (l) (cons (string-append (car opt) (car l))
(list (cdr opt) (cdr l))))
r))
options)))
(define combinations
(cdddr
(let loop ([n n] [r '(("" . x))])
(if (zero? n) r (append r (loop (sub1 n) (add-options r)))))))
(define (make-name combo)
(let ([s (string->symbol (string-append "mc" (car combo) "r"))])
(datum->syntax stx s stx)))
(with-syntax ([(body ...) (map cdr combinations)]
[(name ...) (map make-name combinations)])
#'(begin (define (name x) body) ...)))]))
(define-combinations 4)
(mcaddr (mlist 1 2 3 4 5))
关于macros - cadr、caddr 等的可变版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6240033/
我想知道如何在 Racket 中实现 cadr、caddr 等的可变版本,而不需要单独定义每个版本? IE。不 (define (mcadr exp) (mcar (mcdr exp))) 对
我在网上四处寻找,找不到我的查询的答案。如果有人能在不降低这篇文章评分的情况下提供一个好的答案,我将不胜感激。 在 Lisp car 中,cdr 用于数据模式,如 '(无论此处如何),这对我来说很有意
这个问题在这里已经有了答案: Unusual stack overflow when inserting nodes in binary tree (1 个回答) 关闭 6 年前。 我(仍在)将代码
我是一名优秀的程序员,十分优秀!