Flattening a List of Lists

后端 未结 3 839
旧巷少年郎
旧巷少年郎 2020-12-11 08:07

I\'m new to Scheme and functional programming in general. Can someone explain this code — specifically what kons and knil are? The goal is to flat

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-11 08:29

    Following code using 'named let' and 'for' loop can be used to flatten the list of elements which themselves may be lists:

    (define (myflatten ll)
      (define ol '())
      (let loop ((ll ll))
        (for ((i ll))
          (if (list? i)
              (loop i)
              (set! ol (cons i ol)))))
      (reverse ol))
    
    
    (myflatten '(a () (b e (c)) (((d))))) 
    

    Output:

    '(a b e c d)
    

    However, it uses 'set!' which is generally not preferred.

    The 'for' loop can also be replaced by 'named let' recursion:

    (define (myflatten ll) 
      (define ol '())
      (let outer ((ll ll))
        (let inner ((il ll))
          (cond
            [(empty? il)]
            [(list? (first il))
             (outer (first il))
             (inner (rest il))]
            [else
             (set! ol (cons (first il) ol))
             (inner (rest il))])))
      (reverse ol))
    

提交回复
热议问题