Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define (interpret vec sst)
- (define (iterif j)
- (if (equal? 'endif (vector-ref vec j))
- j
- (iterif (+ j 1))))
- (define (def j lst)
- (if (equal? 'end (vector-ref vec j))
- (cons '(cons (vector-ref vec (+ i 1)) lst)) slv)
- (def (+ j 1) (cons (vector-ref vec j) lst)))
- (define lit (
- ('+ '(main slv (cons (+ (car st) (cadr lst)) (sddr st)) (+ i 1)))
- ('- '(main slv (cons (- (car st) (cadr lst)) (sddr st)) (+ i 1)))
- ('* '(main slv (cons (* (car st) (cadr lst)) (sddr st)) (+ i 1)))
- ('/ '(main slv (cons (quotient (car st) (cadr lst)) (sddr st)) (+ i 1)))
- ('mod '(main slv (cons (remainder (car st) (cadr lst)) (cddr st)) (+ i 1)))
- ('neg '(main slv (cons (- (car st)) (cdr st)) (+ i 1)))
- ('= '(main slv (cons (if (equal? (car st) (cadr st)) -1 0) (cddr st)) (+ i 1)))
- ('> '(main slv (cons (if (> (car st) (cadr st)) -1 0) (cddr st)) (+ i 1)))
- ('< '(main slv (cons (if (< (car st) (cadr st)) -1 0) (cddr st)) (+ i 1)))
- ('not '(main slv (cons (if (equal? 0 (car st)) -1 0) (cdr st)) (+ i 1)))
- ('and '(main slv (cons (if (or (equal? 0 (car st)) (or equal? 0(cadr st))) 0 -1)) (cdr st)) (+ i 1))
- ('or '(main slv (cons (if (and (equal? 0 (car st)) (or equal? 0(cadr st))) 0 -1)) (cdr st)) (+ i 1))
- ('drop '(main slv (cdr st) (+ i 1)))
- ('swap '(main slv (cons (cadr st) (cons (car st) (cddr st))) (+ i 1)))
- ('dup '(main slv (cons (car st) st) (+ i 1)))
- ('over '(main slv (cons (cadr st) st) (+ i 1)))
- ('rot '(main slv (cons (caddr st) (cons (cadr st) (cons (car st) (cdddr st)))) (+ i 1)))
- ; ('depth Как сделать декларативно?
- ('define '(main slv (def (+ i 1) '())) (+ i 1)) ;как встроить рекурсию в словарь ;define пишется на встроеном языке нужно ли сделать отдельный словарь и вставлять значение вместо вызова функции
- ('if '(if (equal? (- 1) (vector-ref (+ 1 i)))
- (main slv st (+ i 1))
- (main slv st (iterif (+ i 2)))))
- ))
- (define (main slv st i) ;обязательны ли отложеные вычисления
- (if (equal? i (+ 1 (vector-length vec)))
- st
- (if (number? (vector-ref vec i))
- (main slv (cons (vector-ref vec i) st) (+ i 1))
- (cdr (assq (vector-ref vec i) slv)))))
- (main lit sst 0) )
- (interpret #(1 2 +) '())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement