Advertisement
bohdanpyryn

Scheme code snippets

Feb 1st, 2020
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 5.02 KB | None | 0 0
  1. Перевіряє чи елемент є у списку
  2. (define (is-in-list element list)(cond
  3.                                    ((eq? list `()) #f)
  4.                                    ((eq? element (car list)) #t)
  5.                                    (#t (is-in-list element (cdr list)))))
  6.  
  7. З'єднює два списки
  8. (define (concat-lists list1 list2)(cond
  9.                                     ((eq? list1 `()) list2)
  10.                                     (#t (cons (car list1) (concat-lists (cdr list1) list2)))
  11.                                     ))
  12.  
  13. Видаляє елементи з першого списку, які є у другому списку
  14. (define (subtract-similar list1 list2) (cond
  15.                        ((eq? list1 `()) `())
  16.                        ((is-in-list (car list1) list2) (subtract-similar (cdr list1) list2))
  17.                        (#t (cons (car list1) (subtract-similar (cdr list1) list2)))))
  18.  
  19. Видаляє елементи з другого списку, які є у першому списку
  20. (define (subtract-similar-2 a b) (subtract-lists b a))
  21.  
  22. Добавляє рівні вкладеності
  23. (define (make-nested list) (cond
  24.                               ((eq? list '()) '())
  25.                               ((eq? (cdr list) '()) list)
  26.                               (#t (cons (car list) (cons (deepen-list (cdr list)) '())))))
  27.  
  28. Перетворює складну спискову структуру в однорівневий список
  29. (define (revoke-nested l) (cond
  30.                            ((eq? l '()) '())
  31.                            ((pair? (car l)) (concat-lists (revoke-nested (car l)) (revoke-nested (cdr l))))
  32.                            (#t (cons (car l) (revoke-nested (cdr l))))))
  33.  
  34. Перевіряє чи є спільні елементи у списках
  35. (define (intersect? l1 l2) (cond
  36.                              ((eq? l1 '()) #f)
  37.                              ((in-list (car l1) l2) #t)
  38.                              (#t (intersect? (cdr l1) l2))))
  39.  
  40. Перевіряє чи елементи входять тільки один раз
  41. (define (is-unique? l) (cond
  42.                       ((eq? l '()) #t)
  43.                       ((is-in-list (car l) (cdr l)) #f)
  44.                       (#t (is-unique? (cdr l)))))
  45.  
  46. Визначає загальну к-сть атомів у списковій структурі та к-сть елементів на верхньому рівні
  47. (define (count-upper l) (cond
  48.                           ((eq? l '()) 0)
  49.                           (#t (+ 1 (count-upper (cdr l))))))
  50. (define (count-atoms l) (cond
  51.                           ((eq? l '()) 0)
  52.                           ((pair? (car l)) (+ (count-atoms (cdr l)) (count-atoms (car l))))
  53.                           (#t (+ 1 (count-atoms (cdr l))))))
  54. (define (count-all l) (cons (count-atoms l) (count-upper l)))
  55.  
  56. На основі двох вхідних списків утворює новий список з таких елементів, що входять у ці списки, але не входять в обидва одночасно
  57. (define (xor-lists a b) (concat-lists (subtract-similar a b) (subtract-similar b a)))
  58.  
  59. Видаляє нульові елементи зі списку
  60. (define (non-zero list) (cond
  61.                           ((eq? list `()) `())
  62.                           ((eq? (car list) `0) (non-zero (cdr list)))
  63.                           (#t (cons (car list) (non-zero (cdr list))))
  64.                           ))
  65.  
  66. Повертає перший елемент, який входить в обидва списки, у протилежному випадку - no.
  67. (define (is-in-list element list)(cond
  68.                                    ((eq? list `()) `no)
  69.                                    ((eq? element (car list)) #t)
  70.                                    (#t (is-in-list element (cdr list)))))
  71.  
  72. (define (check-similar l1 l2) (cond
  73.                              ((eq? l1 '()) `no)
  74.                              ((in-list (car l1) l2) (car l1))
  75.                              (#t (intersect? (cdr l1) l2))))
  76.  
  77. Визначає чи два s-вирази еквівалентні
  78. (define Equals? (lambda(x y) (cond
  79.                                ((AND1 (eq? x '()) (eq? y '())) '#t)
  80.                                ((OR1 (eq? x '()) (eq? y '())) '#f)
  81.                                ((AND1 (LIST? x) (LIST? y)) (AND1 (Equals? (CAR x) (CAR y)) (Equals? (CDR x) (CDR y) )))
  82.                                ((AND1 (PAIR? x) (PAIR? y)) (AND1 (Equals? (CAR x) (CAR y)) (Equals? (CDR x) (CDR y) )))
  83.                                (#t (eq? x y))
  84.                                )))
  85.  
  86. (define AND1 (lambda(x y) (cond ((eq? x '#f) '#f)
  87.                                 ((eq? y '#f) '#f)
  88.                                 (#t '#t)
  89.                                 )))
  90.  
  91. (define OR1 (lambda(x y) (cond ((eq? x '#t) '#t)
  92.                                ((eq? y '#t) '#t)
  93.                                (#t '#f)
  94.                                )))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement