16

リストが与えられた場合、元のリストのスライス(与えられたオフセットと要素の数)を含む新しいリストをどのように選択しますか?

編集:

これまでのところ良い提案。SRFIの1つに何かが指定されていませんか?これは非常に基本的なことのように思われるので、ユーザーランドに実装する必要があることに驚いています。

4

6 に答える 6

13

奇妙なことに、sliceは SRFI-1 では提供されていませんが、SRFI -1 のtakedropを使用して短くすることができます:

(define (slice l offset n)
  (take (drop l offset) n))

PLT スキーム ライブラリや Swindle など、Scheme で使用した拡張機能の 1 つにこの機能が組み込まれていると思いましたが、そうではないようです。新しい R6RS ライブラリでも定義されていません。

于 2008-09-23T16:02:01.357 に答える
9

次のコードはあなたが望むことをします:

(define get-n-items
    (lambda (lst num)
        (if (> num 0)
            (cons (car lst) (get-n-items (cdr lst) (- num 1)))
            '()))) ;'

(define slice
    (lambda (lst start count)
        (if (> start 1)
            (slice (cdr lst) (- start 1) count)
            (get-n-items lst count))))

例:

> (define l '(2 3 4 5 6 7 8 9)) ;'
()
> l
(2 3 4 5 6 7 8 9)
> (slice l 2 4)
(3 4 5 6)
> 
于 2008-09-20T14:08:40.547 に答える
6

この機能を試すことができます:

subseq シーケンスの開始とオプションの終了

開始パラメータはオフセットです。終了パラメーターは、開始+要素数を追加するだけで、取得する要素数に簡単に変換できます。

小さなボーナスは、subseqがすべてのシーケンスで機能することです。これには、リストだけでなく、文字列とベクトルも含まれます。

編集:すべてのlisp実装にsubseqがあるわけではないようですが、それがあれば問題なく動作します。

于 2008-09-22T18:04:29.510 に答える
1
(define (sublist list start number)
  (cond ((> start 0) (sublist (cdr list) (- start 1) number))
        ((> number 0) (cons (car list)
                      (sublist (cdr list) 0 (- number 1))))
        (else '())))
于 2008-09-20T14:17:36.500 に答える
1

sliceこれは、適切なテールコールを使用する私の実装です

(define (slice a b xs (ys null))
  (cond ((> a 0) (slice (- a 1) b (cdr xs) ys))
        ((> b 0) (slice a (- b 1) (cdr xs) (cons (car xs) ys)))
        (else (reverse ys))))

(slice 0 3 '(A B C D E F G)) ;=> '(A B C)
(slice 2 4 '(A B C D E F G)) ;=> '(C D E F)
于 2016-02-21T09:33:28.310 に答える
0

次のようなものを試してください。

    (define (slice l offset length)
      (if (null? l)
        l
        (if (> offset 0)
            (slice (cdr l) (- offset 1) length)
            (if (> length 0)
                (cons (car l) (slice (cdr l) 0 (- length 1)))
                '()))))
于 2008-09-20T14:17:39.730 に答える