List 方案创建列表

List 方案创建列表,list,map,scheme,List,Map,Scheme,你好,这是我的问题 我想从原始列表中创建2个子列表,如下所示 OriginalL '( (item1)(item2)(item3)(node1)(node2)(item4) ) ;its a list of lists 我要创建的列表 itemL '((item1)(item2)(item3)(item4)) ;only contains item type nodeL '((node1)(node2)) ;only contains node type 这是我的函数,它不

你好,这是我的问题

我想从原始列表中创建2个子列表,如下所示

OriginalL '( (item1)(item2)(item3)(node1)(node2)(item4) ) ;its a list of lists  
我要创建的列表

itemL '((item1)(item2)(item3)(item4))    ;only contains item type  
nodeL '((node1)(node2))   ;only contains node type
这是我的函数,它不能正常工作

(define itemL null)   

(define nodeL null)  

(define (separate OriginalL)  
   (map (lambda (i)  
          (if (item? i)
              (cons itemL i)
              (cons nodeL i))
        OrignalL))
但是由于某种原因,我不能得到我想要的清单。问题是什么。项目?仅根据原始列表中的项目类型返回#t或#f。

谢谢

看起来您希望
分开
产生填充两个全局列表的副作用。在这种情况下,您可以使用
append在处理原始列表时向其添加数据:

(define itemL '())   
(define nodeL '())  
(define (separate OriginalL)  
   (map (lambda (i)  
     (if (item? i)
         (append! itemL i)
         (append! nodeL i))
    OrignalL)) 


如果您使用的方案不支持
append你可以自己写。例如,请参见:

看起来您希望
分离
具有填充两个全局列表的副作用。在这种情况下,您可以使用
append在处理原始列表时向其添加数据:

(define itemL '())   
(define nodeL '())  
(define (separate OriginalL)  
   (map (lambda (i)  
     (if (item? i)
         (append! itemL i)
         (append! nodeL i))
    OrignalL)) 


如果您使用的方案不支持
append你可以自己写。例如,请参阅:

如果您使用的是R6RS,则只需执行以下操作:

(let-values (((a b) (partition item? OriginalL))
  (set! itemL a)
  (set! nodeL b))

许多其他计划也将支持这一点。也许可以研究一下SRFI1支持。

如果您使用的是R6RS,您只需执行以下操作:

(let-values (((a b) (partition item? OriginalL))
  (set! itemL a)
  (set! nodeL b))

许多其他计划也将支持这一点。也许可以研究一下SRFI1支持。

这里有一个简单的方法来解决您的问题:

(define itemL (filter item? OriginalL))
(define nodeL (filter (compose not item?) OriginalL))

以下是解决问题的简单方法:

(define itemL (filter item? OriginalL))
(define nodeL (filter (compose not item?) OriginalL))

请考虑重新格式化您的代码,以便使用编辑工具使其更可读。请考虑重新格式化您的代码以使其更易于使用编辑工具。您的意思是<代码>追加!<代码>在那种情况下?是的,这就是我想做的。但它仍然为itemL和nodeL提供空列表。分开后。您测试过此代码吗?@user1233092:您的方案可能支持
append。试试看,否则就写:)这是一个微不足道的过程。我应该提到我正在使用racket,#lang racket。从关于实现on-append的链接中,我不能使用set-cdr!有点傻嗯。。。或者,您可以尝试按照
(set!itemL(append itemli))
的行重新构造代码。不幸的是,我现在手头没有球拍环境。你不是说
append在那种情况下?是的,这就是我想做的。但它仍然为itemL和nodeL提供空列表。分开后。您测试过此代码吗?@user1233092:您的方案可能支持
append。试试看,否则就写:)这是一个微不足道的过程。我应该提到我正在使用racket,#lang racket。从关于实现on-append的链接中,我不能使用set-cdr!有点傻嗯。。。或者,您可以尝试按照
(set!itemL(append itemli))
的行重新构造代码。不幸的是,我现在手头没有球拍环境。