incogn1too (incogn1too) wrote in ru_lisp,
incogn1too
incogn1too
ru_lisp

group

Доброго времени суток. Нужна была функция, которая группирует список группами по несколько элементов. Получился не совсем красивый велосипед. Никто из сообщества не поделиться более элегантным решением?

(define (group lst n)
  (define (group2 n2 lst2 group grouped)
    (cond ((<= (length lst2) n2) (append grouped (list lst2)))
             ((= n2 0) (group2 n lst2 '() (append grouped (list (reverse group)))))
             (else (group2 (- n2 1) (mcdr lst2) (cons (car lst2) group) grouped))))
  (group2 n lst '() '() ))

[UPD] Спасибо всем за ответы. В комментариях подали идею сделать более функциональную реализацию. Получилось что-то такое:

(define (split n lst)
  (map (lambda(x)(take n x))
    (append (list lst) (reverse (cdr
      (unfold (lambda(x)(drop n x)) lst empty?) )))))

(define (unfold func init pred)
  (define (unfold2 func init pred res)
    (let ((x (func init)))
      (if (pred init)
      res
  (unfold2 func x pred (cons x res) ))))
  (unfold2 func init pred '()))

 (define (drop n lst)
  (if (or (= n 0) (empty? lst))
    lst
    (drop (- n 1) (cdr lst))))

(define (take n lst)
  (define (take2 lst n res)
    (if (or (empty? lst) (= n 0)) (reverse res)
      (take2 (cdr lst) (- n 1) (cons (car lst) res))))
      (take2 lst n '()))
Subscribe

  • определение контуров предметов на видео

    Я дико извиняюсь, могу ошибаться, но три-пять лет назад в ЖЖке пробегал пост от лисповода, в котором товарищ демонстрировал как можно просто без…

  • парочка вопросов

    В процессе изучения Лиспа натыкаюсь на некоторые моменты, с которыми пока не могу разобраться. 1) sbcl & nunion Введём такой простой код в repl…

  • скобки в Scheme

    Возможно достаточно глупый вопрос, но я не совсем понимаю в какую сторону копать. (define def1 (let ( (i 0) ) (lambda () (set! i (+ i 1)) i)))…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 8 comments