0

「区切り」要素の間にリストの要素を「カプセル化」する (つまり、リストに入れる) プロシージャを作成しようとしています。

(my-proc '(1 + 2))
=> ((1) (2))

(my-proc '(x * y + z ^ 2 + 1 + 5))
=> ((x * y) (z ^ 2) (1) (5))

(my-proc '((x + 1) * y + 5))
=> (((x + 1) * y) (5))

この場合、+ 記号をセパレーターとして定義するようにプロシージャーをハードコーディングできます。

foldr (右折操作) が定義されていると仮定します。

4

3 に答える 3

0

楽しみのために、ここに継続渡しスタイルのバージョンがあります(いいえfoldr、おそらく宿題の答えとしては適していません):

(define split/cps
  (λ (sep ls)
    (let loop ([ls ls] [k (λ (item acc)
                               (if item (cons item acc) acc))])
      (cond
        [(null? ls)
          (k #f '())]
        [(eq? sep (car ls))
          (loop (cdr ls)
                (λ (item acc)
                  (k #f (if item (cons item acc) acc))))]
        [else
          (loop (cdr ls)
                (λ (item acc)
                  (k (if item
                         (cons (car ls) item)
                         (list (car ls)))
                     acc)))]))))
于 2013-04-10T03:02:27.427 に答える
0

なしで、これを行う別の方法を次に示しますfoldr

(define split/values
  (λ (sep ls)
    (let loop ([ls ls])
      (cond
        [(null? ls)
          '()]
        [else
          (let-values ([(a d) (car-to-sep sep ls)])
            (if (null? a)
                (loop d)
                (cons a (loop d))))]))))

(define car-to-sep
  (λ (sep ls)
    (let loop ([ls ls] [a '()])
      (cond
        [(null? ls)
          (values '() '())]
        [(eq? sep (car ls))
          (values '() (cdr ls))]
        [else
          (let-values ([(a d) (loop (cdr ls) a)])
            (values (cons (car ls) a) d))]))))
于 2013-04-10T13:08:09.717 に答える