- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
(defun question-2 ()
  (let ((b '(1 2 3))
        (a '(1 2 3 4))
        (com (make-hash-table :test #'equal)))
    (labels ((put-sorted (x)
               (let ((key
                      (sort
                       (flatten
                        (copy-tree x)) #'<)))
                 (if (gethash key com)
                     (incf (gethash key com))
                     (setf (gethash key com) 1)))))
      (values (remove-if
       #'(lambda (x)
           (prog ((results
                  (do ((x x (cdr x)) (r))
                      (nil)
                    (setf r (append (cadar x) r))
                    (when (null (cdr x))
                      (return r)))))
             (dolist (y a)
               (when (not (member y results))
                 (go remove-it)))
             (put-sorted results)
             (go keep-it)
             remove-it (return t)
             keep-it nil))
       (all-functions b (cartesian-product a))) com))))
                                 
        
            Ну, чем бы еще порадовать. Вот, родилось во время проверки домашних заданий :)
        
        
> #'
> setf
> dolist
CommonLisp же
Много скобок.
Скобок во всех лиспах хватает ололо в clojure скобок меньше чем в жабе
Тут, вобщем, как в комиксе с динозавром и goto получилось. Было очень влом переделывать по-нормальному. При чем 2 раза (но второй нужно объяснять, и мне лень) там можно было бы без do цикла сделать быстрее через (mapcan #'cdr ...) но я не сразу сообразил в чем фишка, и лень было разбираться.
2) Зачем загонять все задание в одну функцию. ИМХО это только создает лишние labels'ы let'ы, уровни вложенности и проблемы при чтении.
Остальные функции: да, пожалуйста:
Вроде ничего не забыл.