首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scheme中使用语法规则从列表中创建List?

如何在Scheme中使用语法规则从列表中创建List?
EN

Stack Overflow用户
提问于 2020-11-03 16:52:36
回答 2查看 44关注 0票数 2

就像我想要转变的练习一样:

代码语言:javascript
复制
(alist "foo" 1 "bar" 2 "baz" 3)

转到

代码语言:javascript
复制
(("foo" . 1) ("bar" . 2) ("baz" . 3))

使用语法规则可以做到这一点吗?

我的尝试是:

代码语言:javascript
复制
(define-syntax alist
  (syntax-rules ()
     ((_ a b) (cons a b))
     ((_ x y ...)
      (list (alist x y) ...))))

它扩展成的问题是:

代码语言:javascript
复制
(("foo" . 2) ("foo" . "bar") ("foo" . 4) ("foo" . "baz") ("foo" . 6))

是否可以使用语法规则来实现宏列表?它应该是什么样子的?

编辑:

另一次尝试

代码语言:javascript
复制
(define-syntax alist
  (syntax-rules ()
     ((_ a b) (cons a b))
     ((_ x y z ...)
      (list (alist x y) (alist z ...)))))

它返回(("foo" . 2) (("bar" . 4) ("baz" . 6)))

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-04 07:14:20

如果它只是文字(比如"foo"2),你可以这样做:

代码语言:javascript
复制
#!r6rs
(import (rnrs))

(define-syntax alist
  (syntax-rules (alist-builder)
    ((_ alist-builder () (results ...)) 
     '(results ...))
    ((_ alist-builder (a) . rest) 
     (raise 'bad-alist))
    ((_ alist-builder (a b rest ...) (results ...))
     (alist alist-builder (rest ...) (results ... (a . b))))
    ((_ a ...) (alist alist-builder (a ...) ()))))

(alist)         ; ==> ()
(alist "a" 2)   ; ==> (("a" . 2))
(alist a 3 b 4) ; ==> ((a . 3) (b . 4))
(alist a)       ; ==> uncaught exception: bad-alist

当然,您不允许对此进行更改,因为(alist a b c d)与您不允许更改的字面上的'((a . b) (c . d))是相同的。

此外,如果您曾经使用alist-builder作为第一个键来创建一个列表,那么内部将会泄漏。您可以通过拆分内部定义来修复此问题,也可以通过将两者都放在库中并仅导出alist来隐藏它以避免暴露

票数 1
EN

Stack Overflow用户

发布于 2020-11-03 16:56:02

我已经弄明白了:

代码语言:javascript
复制
(define-syntax alist
  (syntax-rules ()
     ((_) ())
     ((_ a b) (list (cons a b)))
     ((_ x y z ...)
      (apply list (cons x y) (alist z ...)))))

和简化版本:

代码语言:javascript
复制
(define-syntax alist
  (syntax-rules ()
     ((_) ())
     ((_ a b) (list (cons a b)))
     ((_ x y z ...)
      (cons (cons x y) (alist z ...)))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64659523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档