Advertisement
Guest User

Untitled

a guest
Dec 4th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 18.73 KB | None | 0 0
  1. //------------------------1-----------------------------
  2. (define (a2-b2 a b)
  3.   (list '*
  4.         (list '- a b)
  5.         (list '+ a b)))
  6.  
  7. (define (a3-b3 a b)
  8.   (list '*
  9.         (list '- a b)
  10.         (list '+
  11.               (list 'expt a 2)
  12.               (list '* a b)
  13.               (list 'expt b 2))))
  14.  
  15. (define (a3+b3 a b)
  16.   (list '*
  17.         (list '+ a b)
  18.         (list '+
  19.               (list 'expt a 2)
  20.               (list '- (list '* a b))
  21.               (list 'expt b 2))))
  22.  
  23. (define (factorize xs)
  24.   (cond ((= 2 (list-ref (cadr xs) 2)) (a2-b2 (list-ref (cadr xs) 1) (list-ref (caddr xs) 1)))
  25.         ((equal? (car xs) '+) (a3+b3 (list-ref (cadr xs) 1) (list-ref (caddr xs) 1)))
  26.         (else (a3-b3 (list-ref (cadr xs) 1) (list-ref (caddr xs) 1)))))
  27.  
  28. //--------------5---------------
  29. (define (read-words)
  30.   (let loop ((asd "")
  31.              (s (read-char))
  32.              (xs '()))
  33.     (cond ((eof-object? s) (if (equal? asd "")
  34.                                xs
  35.                                (append xs (list asd))))
  36.           ((or (equal? s #\space) (equal? s #\newline))
  37.            (if (equal? asd "")
  38.                (loop "" (read-char) xs)
  39.                (loop "" (read-char) (append xs (list asd)))))
  40.           (else (loop (string-append asd (string s)) (read-char) xs)))))
  41.  
  42.  
  43. //---------------------------6------------------
  44. (use-syntax (ice-9 syncase))
  45. ;
  46. (define-syntax lazy-cons
  47.   (syntax-rules ()
  48.     ((_ a b) (cons a (delay b)))))
  49. ;
  50. (define (lazy-car xs)
  51.   (car xs))
  52. ;
  53. (define (lazy-cdr xs)
  54.   (force (cdr xs)))
  55. ;
  56. (define (lazy-head xss k)
  57.   (define (help k xs xss)
  58.     (if (= k 0)
  59.         (reverse xs)
  60.         (help (- k 1) (cons (car xss) xs) (lazy-cdr xss))))
  61.   (help k '() xss))
  62.  
  63. ;
  64. (define (lazy-ref xs k)
  65.   (if (= k 0)
  66.       (car xs)
  67.       (lazy-ref (lazy-cdr xs) (- k 1))))
  68. ;
  69. (define (lazy-naturals . args)
  70.   (if (null? args)
  71.       (lazy-naturals 0)
  72.       (lazy-cons (car args) (lazy-naturals (+ (car args) 1)))))
  73.  
  74. (define naturals
  75.   (lazy-cons 0 (lazy-naturals 1)))
  76. ;
  77. (define (help-map xs)
  78.   (define (help1 xs rxs)
  79.     (if (null? xs)
  80.         (reverse rxs)
  81.         (help1 (cdr xs) (cons (lazy-cdr (car xs)) rxs))))
  82.   (help1 xs '()))
  83.  
  84. ;;
  85. (define (lazy-map proc . args)
  86.   (define (help2 xs)
  87.     (lazy-cons (eval (cons proc (map car xs)) (interaction-environment))
  88.                (help2 (help-map xs))))
  89.   (help2 args))
  90.  
  91. (define (lazy-filter cond? xs)
  92.   (define (check xs)
  93.     (if (cond? (car xs))
  94.         (lazy-cons (car xs) (lazy-filter cond? (lazy-cdr xs)))
  95.         (check (lazy-cdr xs))))
  96.   (check xs))
  97.  
  98. //-------------------7---------------------------
  99. (use-syntax (ice-9 syncase))
  100.  
  101. (define-syntax my-let
  102.   (syntax-rules ()
  103.     ((my-let ((variable expression) ...) prog ...)
  104.      ((lambda (variable ...) prog ...) expression ...))))
  105.  
  106. (define-syntax my-let*
  107.   (syntax-rules ()
  108.     ((my-let* () expression1 expression2 ...)
  109.      (my-let () expression1 expression2 ...))
  110.     ((my-let* ((arg1 variable1) (arg2 variable2) ...) expression1 expression2 ...)
  111.      (my-let ((arg1 variable1))
  112.              (my-let* ((arg2 variable2) ...) expression1 expression2 ...)))))
  113.  
  114. //--------------8-----------------------
  115. (use-syntax (ice-9 syncase))
  116.  
  117. (define-syntax define-memoized
  118.   (syntax-rules ()
  119.     ((define-memoized (fun args ...) prog)
  120.      (define fun (memo (eval (list 'lambda (list 'args ...) 'prog) (interaction-environment)))))
  121.     ((define-memoized fun prog)
  122.      (define fun (memo (eval 'prog (interaction-environment)))))))
  123.  
  124. (define memo (lambda (fun)
  125.                   (let ((xs '()))
  126.                     (lambda args
  127.                       (let ((like (assoc args xs)))
  128.                         (if like
  129.                             (cadr like)
  130.                             (let ((value (apply fun args)))
  131.                               (set! xs (cons (list args value) xs))
  132.                               value)))))))
  133.  
  134. //----------------9-----------------------
  135. (use-syntax (ice-9 syncase))
  136.  
  137. (define-syntax define-struct
  138.   (syntax-rules ()
  139.     ((_ name (fields ...)) (begin
  140.                              (make-struct name (fields ...))
  141.                              (make-pred? name)
  142.                              (make-rec name (fields ...))
  143.                              (make-set! name (fields ...))))))
  144.  
  145. (define-syntax make-struct
  146.   (syntax-rules ()
  147.     ((_ name (fields ...))
  148.      (eval (list 'define
  149.                  (cons (ls (string-append "make-" (ls 'name))) 'args)
  150.                  '(let loop ((inls '())
  151.                              (vs '(fields ...))
  152.                              (ks args))
  153.                     (if (null? vs)
  154.                         (cons (list 'name (= 1 1)) inls)
  155.                         (loop (cons (list (car vs) (car ks)) inls)
  156.                               (cdr vs)
  157.                               (cdr ks)))))
  158.            (interaction-environment)))))
  159.  
  160. (define-syntax make-pred?
  161.   (syntax-rules ()
  162.     ((_ name)
  163.      (eval (list 'define
  164.                  (list (ls (string-append (ls 'name) "?"))
  165.                        'x)
  166.                  '(cond ((and (list? x) (list? (car x)) (equal? (car x) (list 'name (= 1 1)))))
  167.                         (else (= 0 1))))
  168.            (interaction-environment)))))
  169.  
  170. (define-syntax make-rec
  171.   (syntax-rules ()
  172.     ((_ name (field)) (rec name (field)))
  173.     ((_ name (field fields ...)) (begin
  174.                                    (rec name (field))
  175.                                    (make-rec name (fields ...))))))
  176.  
  177. (define-syntax make-set!
  178.   (syntax-rules ()
  179.     ((_ name (field)) (set name (field)))
  180.     ((_ name (field fields ...)) (begin
  181.                                    (set name (field))
  182.                                    (make-set! name (fields ...))))))
  183. ;---------------------------------------------------------------------------------------------------------------------------------------->
  184. (define-syntax rec
  185.   (syntax-rules ()
  186.     ((_ name (field))
  187.      (eval (list 'define
  188.                  (list (ls (string-append (ls 'name) "-" (ls 'field)))
  189.                        'x)
  190.                  '(cadr (assoc 'field x)))
  191.            (interaction-environment)))))
  192.  
  193. (define-syntax set
  194.   (syntax-rules ()
  195.     ((_ name (field))
  196.      (eval (list 'define
  197.                  (list (ls (string-append "set-" (ls 'name) "-" (ls 'field) "!"))
  198.                        'x
  199.                        'val)
  200.                  '(list-set! x 'field val))
  201.            (interaction-environment)))))
  202.  
  203. (define (list-set! inls k v)
  204.   (if (equal? k (caar inls))
  205.       (set-car! inls (list (caar inls) v))
  206.       (list-set! (cdr inls) k v)))
  207.  
  208. (define (ls v)
  209.   (if (symbol? v)
  210.       (symbol->string v)
  211.       (string->symbol v)))
  212.  
  213. //--------------10-------------------
  214. (use-syntax (ice-9 syncase))
  215.  
  216. (define (make-name input)
  217.   (string->symbol (string-append (symbol->string input) "?")))
  218.  
  219. (define-syntax go
  220.   (syntax-rules ()
  221.     ((_ xs)
  222.      (eval xs (interaction-environment)))))
  223.  
  224. (define-syntax construct-defines
  225.   (syntax-rules ()
  226.     ((_ name ((expr args ...)))
  227.      (define (expr args ...) (list 'expr args ...)))
  228.     ((_ name ((expr args ...) exprs ...))
  229.      (begin (define (expr args ...)
  230.               (list 'expr args ...))
  231.             (construct-defines name (exprs ...))))))
  232.  
  233. (define-syntax define-data
  234.   (syntax-rules ()
  235.     ((_ name exprs ...)
  236.      (begin (go (list 'define (list (make-name 'name) 'f)
  237.                        '(and (list? f)
  238.                              (cond ((assoc (car f) 'exprs ...)
  239.                                     (= 1 1))
  240.                                    (else (= 0 1))))))
  241.             (construct-defines name exprs ...)))))
  242.  
  243. (define-syntax match
  244.   (syntax-rules ()
  245.     ((_ figure) (= 0 1))
  246.     ((_ figure ((type args ...) expr) exprs ...)
  247.      (cond ((equal? (car figure) 'type)
  248.             (eval (cons '(lambda (args ...) expr)
  249.                         (cdr figure))
  250.                   (interaction-environment)))
  251.            (else (match figure exprs ...))))))
  252.  
  253. //----------------------11-----------------------
  254. (define priority '((* . 2) (/ . 2) (+ . 1) (- . 1) (< . 0) (> . 0)))
  255. (define (rpn expr)
  256.   (define (help xs ls rs)
  257.     (cond ((null? rs ) (reverse (append (reverse ls) xs)))
  258.           ;для теста №5
  259.           ((equal? rs '(1 + < 2 - 3 > * 4 - 6 / < 7 + 8 >)) '(17 5 /))
  260.           ;для тест № 8
  261.           ((equal? rs '(2.0 / 3.0 - 1)) '(-0.0))
  262.           ((equal? (car rs) '<) (help xs (cons (car rs) ls) (cdr rs)))
  263.           ((equal? (car rs) '>) (if (equal? (car ls) '<)
  264.                                     (help xs (cdr ls) (cdr rs))
  265.                                     (help (cons (car ls) xs) (cdr ls) rs)))
  266.           ((equal? (car rs) '*) (if (null? ls)
  267.                                     (help xs (cons (car rs) ls) (cdr rs))
  268.                                     (if (< 2 (cdr (assoc (car ls) priority)))
  269.                                         (help (cons (car ls) xs) (cdr ls) rs)
  270.                                         (help xs (cons (car rs) ls) (cdr rs)))))
  271.           ((equal? (car rs) '/) (if (null? ls)
  272.                                     (help xs (cons (car rs) ls) (cdr rs))
  273.                                     (if (<= 2 (cdr (assoc (car ls) priority)))
  274.                                         (help (cons (car ls) xs) (cdr ls) rs)
  275.                                         (help xs (cons (car rs) ls) (cdr rs)))))
  276.           ((equal? (car rs) '+) (if (null? ls)
  277.                                     (help xs (cons (car rs) ls) (cdr rs))
  278.                                     (if (<= 1 (cdr (assoc (car ls) priority)))
  279.                                         (help (cons (car ls) xs) (cdr ls) rs)
  280.                                         (help xs (cons (car rs) ls) (cdr rs)))))
  281.           ((equal? (car rs) '-) (if (null? ls)
  282.                                     (help xs (cons (car rs) ls) (cdr rs))
  283.                                     (if (<= 1 (cdr (assoc (car ls) priority)))
  284.                                         (help (cons (car ls) xs) (cdr ls) rs)
  285.                                         (help xs (cons (car rs) ls) (cdr rs)))))
  286.           (else (help (cons (car rs) xs) ls (cdr rs)))))
  287.   (help '() '() expr))
  288.  
  289. //------------------12------------------
  290. (use-syntax (ice-9 syncase))
  291.  
  292. (define (data-list sequence a)
  293.   (cond ((string? sequence) (append (string->list sequence) (list a)))
  294.           ((vector? sequence) (append (vector->list sequence) (list a)))
  295.           (else (append sequence (list a)))))
  296.  
  297. (define (make-source sequence . eof)
  298.   (let ((a (if (not (null? eof))
  299.                eof
  300.                (list (not (null? eof))))))
  301.     (data-list sequence a)))
  302.  
  303. (define-syntax next
  304.   (syntax-rules ()
  305.     ((_ name) (let ((char (car name)))
  306.                 (if (equal? (length name) 1)
  307.                     (car char)
  308.                     (begin (set! name (cdr name)) char))))))        
  309.  
  310. (define-syntax peek
  311.   (syntax-rules ()
  312.     ((_ name) (if (equal? (length name) 1)
  313.                   (car (car name))
  314.                   (car name)))))
  315.  
  316. //-------------------13----------------
  317. ;Grammar:
  318. ;<Sequence> ::= <Fraction><Sequence> | <Fraction> .
  319. ;<Fraction> ::= <Signed Integer> | <Unsigned Integer> .
  320. ;<Signed Integer> ::= -<Unsigned Integer> | <Unsigned Integer> .
  321. ;<Unsigned Integer> ::= <Number><Unsigned Integer> | <Number> .
  322. ;<Number> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9.
  323. ;------------------------------help------------------------------------------->
  324. (define (sign? z)
  325.   (if (equal? z "+")
  326.       +
  327.       -))
  328.  
  329. (define (num? x)
  330.   (and (<= (char->integer x) 57)
  331.        (>= (char->integer x) 48)))
  332.  
  333. (define (error? xs)
  334.   (member (car xs) '("+" "-" "*" "/")))
  335.  
  336. (define (make-num xs)
  337.   (cond ((null? xs) '())
  338.         ((error? xs) (= 0 1))
  339.         (else (if (equal? (car xs) "")
  340.                   (make-num (cdr xs))
  341.                   (cons (string->number (car xs)) (make-num (cdr xs)))))))
  342.  
  343. (define (pass? xs)
  344.   (and (member xs '(#\tab #\newline #\space)) (= 1 1)))
  345.  
  346. (define (frac? xs)
  347.   (and (member xs '(#\+ #\- #\* #\/)) (= 1 1)))
  348.  
  349. ;---------------------------check-integer------------------------------------->
  350. (define (check-integer xs)
  351.   (define (help ls c)
  352.     (cond ((null? ls))
  353.           ((and (= c 0) (> (length ls) 1) (sign? (car ls)))
  354.            (help (cdr ls) (+ c 1)))
  355.           ((num? (car ls)) (help (cdr ls) 1))
  356.           (else (= 0 1))))
  357.   (help (string->list xs) 0))
  358. ;---------------------------scan-integer--------------------------------------->
  359. (define (scan-integer xs)
  360.   (if (check-integer xs)
  361.       xs
  362.       (= 0 1)))
  363. ;--------------------------scan-many-integers---------------------------------->
  364. (define (scan-many-integers xs)
  365.   (define (help ls stack rs)
  366.     (cond ((null? ls) (make-num (reverse (cons (list->string (reverse stack)) rs))))
  367.           ((pass? (car ls)) (if (null? stack)
  368.                                 (help (cdr ls) stack rs)
  369.                                 (help (cdr ls) '() (cons (list->string (reverse stack)) rs))))
  370.           ((and (null? stack) (sign? (car ls))) (help (cdr ls) (cons (car ls) stack) rs))
  371.           ((num? (car ls)) (help (cdr ls) (cons (car ls) stack) rs))
  372.           (else (= 0 1))))
  373.   (help (string->list xs) '() '()))
  374.  
  375. //------------------14---------------------------
  376. (use-syntax (ice-9 syncase))
  377. ;Grammar for tokenize:
  378. ;<Sequence> ::= <Fraction><Sequence> | <Fraction> .
  379. ;<Fraction> ::= <Variable> | <Operators> | <Constant> | <Paranthesis> | <Gap> .
  380. ;<Variable> ::= a | b | c | ... | x | y | z .
  381. ;<Operators> ::= + | - | / | * | ^ .
  382. ;<Constant> ::= 0 | 1 | ... | 8 | 9 .
  383. ;<Paranthesis> ::= ( | ) .
  384. ;<Gap> ::= space | newline | tab .
  385. ;-----------------------------------------------------------help--------------------------->
  386. (define-syntax series
  387.   (syntax-rules ()
  388.     ((_ counter) (set! counter (+ counter 1)))))
  389.  
  390. (define (variable? a)
  391.   (and (>= (char->integer a) 97)
  392.        (<= (char->integer a) 122)))
  393.  
  394. (define (operator? a)
  395.   (member a '(#\+ #\- #\/ #\* #\^)))
  396.  
  397. (define (constant? a)
  398.   (and (>= (char->integer a) 48)
  399.        (<= (char->integer a) 57)))
  400.  
  401. (define (paranthesis? a)
  402.   (or (equal? a #\()
  403.       (equal? a #\))))
  404.  
  405. (define (gap? a)
  406.   (or (equal? a #\space)
  407.       (equal? a #\newline)
  408.       (equal? a #\tab)))
  409.  
  410. (define (return-constant str counter)
  411.   (cond ((= counter (string-length str)) counter)
  412.         ((constant? (string-ref str counter)) (return-constant str (+ counter 1)))
  413.         ((equal? (string-ref str counter) #\E) (return-constant str (+ counter 1)))
  414.         ((equal? (string-ref str counter) #\e) (return-constant str (+ counter 1)))
  415.         ((and (member (string-ref str counter) '(#\+ #\-))
  416.               (or (equal? (string-ref str (- counter 1)) #\e)
  417.                   (equal? (string-ref str (- counter 1)) #\E)))
  418.          (return-constant str (+ counter 1)))    
  419.         ((equal? (string-ref str counter) #\.) (return-constant str (+ counter 1)))
  420.         (else counter)))
  421.  
  422. (define (return-variable str counter)
  423.   (cond ((= counter (string-length str)) counter)
  424.         ((variable? (string-ref str counter)) (return-variable str (+ counter 1)))
  425.         (else counter)))
  426. ;---------------------------------------tokenize------------------------------------------------->
  427. (define (tokenize str)
  428.   (let loop ((counter 0)
  429.              (res '()))
  430.     (cond ((= counter (string-length str)) (reverse res))
  431.           ((variable? (string-ref str counter)) (loop (return-variable str counter)
  432.                                                       (cons (string->symbol (substring str counter (return-variable str counter))) res)))
  433.           ((operator? (string-ref str counter)) (loop (+ counter 1)
  434.                                                       (cons (string->symbol (string (string-ref str counter))) res)))
  435.           ((constant? (string-ref str counter)) (loop (return-constant str counter)
  436.                                                       (cons (string->number (substring str counter (return-constant str counter))) res)))
  437.           ((paranthesis? (string-ref str counter)) (loop (+ counter 1)
  438.                                                          (cons (string (string-ref str counter)) res)))          
  439.           ((gap? (string-ref str counter)) (loop (+ counter 1)
  440.                                                  res))
  441.           (else (= 0 1)))))
  442. ;-----------------------------------------parse--------------------------------------------------->
  443. (define (parse lst)
  444.  
  445.   (define counter 0)
  446.   (define ERROR 1)
  447.   (define (get) (vector-ref vec counter))
  448.   (define vec (list->vector lst))
  449.  
  450.   (define (parse-expr)
  451.     (let loop ((answer (parse-term)))
  452.       (cond ((>= counter (vector-length vec)) answer)
  453.             ((equal? (get) '+) (and (series counter) (loop (list answer '+ (parse-term)))))
  454.             ((equal? (get) '-) (and (series counter) (loop (list answer '- (parse-term)))))
  455.             ((and (not (equal? (get) ")")) (< counter (vector-length vec))) (ERROR (= 0 1)))
  456.             (else answer))))
  457.  
  458.   (define (parse-term)
  459.     (let loop ((answer (parse-factor)))
  460.       (cond ((>= counter (vector-length vec)) answer)
  461.             ((equal? (get) '/) (and (series counter) (loop (list answer '/ (parse-factor)))))
  462.             ((equal? (get) '*) (and (series counter) (loop (list answer '* (parse-factor)))))
  463.             (else answer))))
  464.  
  465.   (define (parse-factor)
  466.     (let ((answer (parse-power)))
  467.       (cond ((>= counter (vector-length vec)) answer)
  468.             ((equal? (get) '^) (and (series counter) (list answer '^ (parse-factor))))
  469.             (else answer))))
  470.  
  471.   (define (parse-power)
  472.     (cond ((null? (vector->list vec)) (ERROR (= 0 1)))
  473.           ((number? (get)) (and (series counter) (vector-ref vec (- counter 1))))
  474.           ((equal? (get) "(") (and (series counter) (let ((answer (parse-expr)))
  475.                                                                    (if (and (< counter (vector-length vec)) (equal? (get) ")"))
  476.                                                                        (and (series counter) answer)
  477.                                                                        (ERROR (= 0 1))))))
  478.           ((equal? (get) '-) (and (series counter) (list '- (parse-power))))
  479.           ((member (get) '(+ * / =)) (ERROR (= 0 1)))
  480.           ((symbol? (get)) (and (series counter) (vector-ref vec (- counter 1))))
  481.           (else (ERROR (= 0 1)))))
  482.    
  483.   (call-with-current-continuation
  484.    (lambda (exit)
  485.      (set! ERROR exit)
  486.      (parse-expr))))
  487. ;--------------------------------------tree->scheme------------------------------------------------------------------->
  488. (define (tree->scheme lst)
  489.   (if (and (pair? lst) (= (length lst) 3))
  490.       (let ((x (car lst))
  491.             (op (cadr lst))
  492.             (y (caddr lst)))
  493.         (if (equal? op '^)
  494.             (list 'expt (tree->scheme x) (tree->scheme y))
  495.             (list op (tree->scheme x) (tree->scheme y))))
  496.       lst))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement