Как я беру часть списка (Подсписок) в схеме?

Я нашел, что было не так. Я импортировал эти модули как константы, поэтому результаты оказались неверными. Когда я импортировал эти модули как переменные, я получил хорошие результаты.

14
задан troelskn 20 September 2008 в 16:19
поделиться

5 ответов

Следующий код сделает то, что Вы хотите:

(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)
> 
8
ответ дан 1 December 2019 в 10:05
поделиться

Странно, slice не предоставлен SRFI-1, но можно сделать его короче при помощи SRFI-1's take и drop :

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

я думал, что одно из расширений, которые я использовал со Схемой, как библиотека PLT Scheme или Надувательство, имело бы это встроенным, но это, кажется, не имеет место. Это даже не определяется в новых библиотеках R6RS.

11
ответ дан 1 December 2019 в 10:05
поделиться
(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 '())))
1
ответ дан 1 December 2019 в 10:05
поделиться

Можно попробовать эту функцию:

последовательность subseq запускают & дополнительный конец

Эти запускается , параметр является Вашим смещением. конец параметр может быть легко превращен в число элементов для захвата путем простого добавления, запускаются + число элементов.

А маленькая премия - то, что работы subseq над всеми последовательностями, которые это включает не только, перечисляют, но также и строка и векторы.

Редактирование: кажется, что не все реализации шепелявости имеют subseq, хотя это сделает задание очень хорошо, если у Вас будет он.

6
ответ дан 1 December 2019 в 10:05
поделиться

Попробуйте что-то вроде этого:

    (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)))
                '()))))
0
ответ дан 1 December 2019 в 10:05
поделиться