- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在我的 CS 类的 Scheme (R5RS) 中编写一个过程,该过程将表达式(符号或列表)作为参数并返回 (1) 所有可能的表达式的列表通过在表达式 and (2) 上使用 car 和 cdr 以及演示如何获得原始表达式的这些组件中的每一个的表达式形成。如果一件作品可以通过多种方式获得,则应多次归还。
Examples
(pieces '()) => ((() x))
(pieces 'apple) => ((apple x))
(pieces '(apple)) => (((apple) x) (apple (car x)) (() (cdr x)))
(pieces '(a (b c))) =>
(((a (b c)) x)
(a (car x))
(((b c)) (cdr x))
((b c) (car (cdr x)))
(b (car (car (cdr x))))
((c) (cdr (car (cdr x))))
(c (car (cdr (car (cdr x)))))
(() (cdr (cdr (car (cdr x)))))
(() (cdr (cdr x))))
由于我们刚刚开始使用 Scheme,因此我们只能使用相当基本的语法来完成这项任务。这是我到目前为止所拥有的:
(define pieces
(lambda (exp)
(cond
((symbol? exp)
(list exp 'x))
((null? exp)
(list '() 'x))
((list? exp)
(let ((b (pieces (car exp))) (c (pieces (cdr exp))))
(list exp 'x b c))))))
(pieces '()) => (() x)
(pieces 'apple) => (apple x)
(pieces '(apple)) => ((apple) x (apple x) (() x))
(pieces '(a (b c))) => ((a (b c)) x (a x) (((b c)) x ((b c) x (b x) ((c) x (c x) (() x)))
(() x)))
该过程返回所有正确的元素,但每次递归都会导致组件嵌套在一个附加列表中。有什么办法可以避免吗?
此外,对于问题的第二部分,我不知道从哪里开始(显示每个元素是如何使用 car 和 cdr 从原始元素中获取的)。我已经尝试了上百万种不同的方法,但没有一种接近奏效。如果有人对如何实现该功能有任何提示或建议,我将不胜感激。非常感谢。
最佳答案
(pieces 'apple) => (apple x)
但它应该是((apple x))
,对吧?您应该得到一个列表,其中第一个也是唯一一个元素是列表 (apple x)
。
终止递归的 cond 子句(exp 是一个符号或 null)返回应该进入列表的项目,而在 car
和 cdr
上重复出现的子句尝试创建项目列表。由于 pieces
可以返回项目和项目列表,因此很难从它返回的值中创建项目列表:当您执行 (list exp 'x b c)
你不知道 b
和 c
是应该进入列表还是项目列表的项目。
如果您确保 pieces
始终返回项目列表(例如 (list (list exp 'x))
),事情就会变得容易得多。当您重复使用 car
和 cdr
时,您想要执行类似 append
列表 a
和 b 的操作
并将“当前”((list exp 'x)
) 项添加到该列表(可能带有 cons
或其他内容)。
对于第二部分,pieces
必须知道它是如何到达当前项目的。您可以使 pieces
将当前项目的“路径”作为(可能是可选的)参数。如果路径是一个列表,那么当您在 (car exp)
上调用 pieces
时,您可以向您要访问的路径添加一个 car
符号作为参数发送,对于 (cdr exp)
,您可以添加符号 cdr
。然后你使用路径创建一些很好的东西来替代 (list exp 'x)
中的 'x
。
关于list - 方案:返回一个表达式的所有元素,可以使用car和cdr的任意组合得到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9042255/
我最近一直在研究 Scheme 并遇到了一个按以下方式定义的函数: (define remove! (let ((null? null?) (cdr cdr)
我有一个一般的 Angular 问题: 为什么 Angular async管道使用cdr.markForCheck()而不是 cdr.detectChanges() ? 我看到这两种“风格”有两个主要
我想获取通话的持续时间,但混淆了要使用哪个变量 ${CDR(持续时间)} 或 ${CDR(billsec)} Here不清楚${CDR(duration)}从何时开始记录时间 那么我应该使用 ${CD
我正在尝试编写一个脚本来访问不同的服务器,查找特定文件的更新时间并返回进一步处理的时间。问题是当在特定服务器上找不到文件时脚本退出,有人可以帮忙吗? while true do for i in o
我编写了一个使用 car 和 cdr 的大程序,并且执行以下操作: (map car (append (map caddr lists) (map cadr lists)) 当 lists 是下一个格
这可能是我错过的一件简单的事情,但我试图获取一对的 cdr 以及每次调用 (cdr (cons 'a '5) ) 返回为 (5)。我有点明白为什么会这样,但是我怎样才能让它在没有括号的情况下返回呢?
我正在尝试构建一个查询来并发调用我上传到 MySQL 的 Asterisk CDR。 我已经尝试了位于这些线程上的以下示例: mysql query - peak concurrent calls C
考虑这个列表:((3 (1 (2 15) (8 5))) (1 10)),我想得到它的头部和 body 。正如我想象的那样,程序“汽车”在这里工作:(car '((3 (1 (2 15) (8 5))
如果我这样做 (setq x '(NOT (NOT (NOT (NOT A)))) ) (cdr x) 是 (NOT (NOT (NOT A)))) 但是(cdr (cdr x))是NIL 这是怎
有人可以给我一个关于 car 和 cdr 的变体在Scheme中做什么的基本解释吗? 如果我是正确的,car 将返回列表中的第一项。 cdr 将返回一个不包括第一个元素的列表。 我对这些的其他变体感到
我正在阅读SICP 4.1.3 Evaluator Data Structures (define (make-frame variables values) (cons variables va
我创建了自定义字段“rec_name”id 表“cdr”,数据库“asteriskcdrdb”。在此字段中,我想存储录音名称。我知道我应该通过在 .conf 文件之一中添加这一行来做到这一点,但在哪里
这是我的情况,我能够使用修剪或替换删除空格。但它不会删除每个文件末尾的换行符或换行符。如何在 C# 中删除空格和换行符? 提前致谢。 最佳答案 您可以调用 Trim 方法来处理所有要删除的字符,例如:
谁能精通 lisp 给我解释一下这个笑话?我读过一些关于函数式编程语言的书,知道 CAR/CDR 的意思是地址/递减寄存器的内容,但我仍然不太理解其中的幽默。 最佳答案 在 Lisp 中,链表元素称为
我正在做一个学校的项目,我们得到了一个 .o 和一个相应的 .h 文件。我们需要在 .c 程序中使用 .o 文件中的几个函数。只是将它放在同一个目录中是行不通的。我试图在项目属性中寻找类似的东西,但没
我有数百万个 fasta 格式的序列,想提取 CDR(CDR1、CDR2 和 CDR3)。我只选择了一个序列作为示例,并尝试提取 CDR1,但无法提取 CDR1。 序列:-'FYSHSAVTLDESG
如何仅使用以下三个函数从列表中获取第 2 到第 7 个元素: cons car cdr 例子; > (two-to-seven (list 8 9 5 1 0 3 6 2 4)) > (9 5 1 0
我有一个 SVG 文件,其中包含旋转、半透明、剪切(剪切路径)元素(例如多边形、图像)。该文件在 Inkscape 中完美运行,但对于进一步的图像处理,我也想在 CorelDraw 中使用它。但是在
我试图了解 car 和 cdr 的多个调用如何协同工作。例如,以下示例看起来很简单: (car (cdr '(car (cdr (1 2 3)))) 我的 DrRacket 编译器在运行时输出 '(c
从 Asterisk 1.8 开始,MySQL CDR 存储似乎是内置的(cdr_mysql.so 和 Asterisk 附加组件一样已被弃用)。我配置了 cdr_mysql.conf (与 res_
我是一名优秀的程序员,十分优秀!