【问题标题】:Assigning a value only if certain conditions are fulfilled in Scheme只有在 Scheme 中满足某些条件时才赋值
【发布时间】:2015-03-08 06:34:06
【问题描述】:

我有一个可能包含一些空值的列表。但是,我打算忽略那些空值。我的列表示例是:
(() () MC+ () MD- () () ME+)

在我的过程中,我遍历这些元素并使用 let 创建一个本地绑定变量,该变量绑定到此列表中的一个元素。但是,只有当值不为空时,我才应该能够绑定变量。目前,我正在这样做:

(let* ([disjunct (car disjunct-list)])

但是,只有当该元素不为空时,才应为 disjunct 分配一个值。这意味着分配给 disjunct 的值应该是:MC+

它应该遍历所有值并选择下一个非空值并将其分配给disjunct。

还有一件事,我正在对disjunct 进行进一步的操作。并且递归地,我将列表的其余部分向下传递。所以下次我递归调用这个过程时,disjunct 的值应该是MD-。那就是使用(cdr disjunct-list)我应该能够得到以下列表:(() MD- () () ME+)

如何做到这一点?

【问题讨论】:

    标签: scheme guile


    【解决方案1】:

    从头开始过滤输入列表(在实际将其传递给递归过程之前),这样您就可以放心地忽略那些讨厌的空列表并只关注实际值。例如:

    (define disjuncts (filter (lambda (e) (not (null? e)))
                              '(() () MC+ () MD- () () ME+)))
    (car disjuncts)
    => 'MC+
    
    (cadr disjuncts)
    => 'MD-
    
    (caddr disjuncts)
    => 'ME+
    

    【讨论】:

    • 这就是要走的路。我同意。但是有没有办法做我上面问的。我已经实现了一个过滤器。我很好奇是否有办法做我上面概述的事情。
    • @RohitShinde 在使用之前,您必须获取每个元素的 car 并询问它是否为 null?。如果你问我真的很麻烦,如果我们在处理之前保证输入数据是好的,它会更干净;)
    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多