152 lines
3.9 KiB
Text
Executable file
152 lines
3.9 KiB
Text
Executable file
#!/usr/bin/newlisp
|
|
|
|
; qa-inplace - test in-place modificatin since v.10.1.12
|
|
; This file tests a usually not used ability of
|
|
; destructive functions to modify not only the
|
|
; contents of symbols and places in list structures
|
|
; but also the programming text in-place of a function.
|
|
; newLISP has supported this for some destructive
|
|
; functions for a long time, but it has never been
|
|
; publicized or promoted.
|
|
|
|
; Many will in-place modification as bad programming
|
|
; style, but I think that it has interesting and little
|
|
; explored possibilties.
|
|
|
|
; Changes for in-place also have made code smaller and
|
|
; faster of the functions involved.
|
|
|
|
|
|
(define (inplace-++---)
|
|
(++ 0)
|
|
(-- 0))
|
|
|
|
(define (inplace-inc-dec)
|
|
(inc 0)
|
|
(dec 0))
|
|
|
|
(define (inplace-extend)
|
|
(extend "abc" "def")
|
|
(extend '(1 2 3) '(4 5 6)))
|
|
|
|
(define (inplace-pop-assoc)
|
|
(pop-assoc 'b '((a 1) (b 2))))
|
|
|
|
(define (inplace-push-pop)
|
|
(push "a" "bc")
|
|
(push 'a '(b c))
|
|
(pop "abc")
|
|
(pop '(a b c)))
|
|
|
|
(define (inplace-replace)
|
|
(replace "de" "abcdefg" "XX"))
|
|
|
|
(define (inplace-rotate)
|
|
(rotate '(a b c)))
|
|
|
|
; also check nth, first, last
|
|
; 10.2.18 assoc, lookup and set-ref, ref, rotate on result
|
|
(define (inplace-setf-setq)
|
|
(setf 0 1)
|
|
(setf ('(a b) 0) 'A)
|
|
(setf (first '(a b c)) 'A)
|
|
(setf (last '(a b c)) 'C)
|
|
(setf (first "abc") "A")
|
|
(setf (last "abc") "C")
|
|
(setf (nth 1 '(a b c)) 'B))
|
|
|
|
(define (inplace-sort)
|
|
(sort '(q t r w e)))
|
|
|
|
(define (inplace-swap)
|
|
(swap "abc" 123))
|
|
|
|
(define (qa-inplace)
|
|
(and
|
|
(inplace-++---)
|
|
(= inplace-++--- (lambda () (++ 1) (-- -1)))
|
|
|
|
(inplace-inc-dec)
|
|
(= inplace-inc-dec (lambda () (inc 1) (dec -1)))
|
|
|
|
(inplace-extend)
|
|
(= inplace-extend
|
|
(lambda () (extend "abcdef" "def") (extend '(1 2 3 4 5 6) '( 4 5 6))))
|
|
|
|
(inplace-pop-assoc)
|
|
(= inplace-pop-assoc (lambda () (pop-assoc 'b '((a 1)))))
|
|
|
|
(inplace-push-pop)
|
|
(= inplace-push-pop
|
|
(lambda () (push "a" "abc") (push 'a '(a b c)) (pop "bc") (pop '(b c))))
|
|
|
|
(inplace-replace)
|
|
(= inplace-replace (lambda () (replace "de" "abcXXfg" "XX")))
|
|
|
|
(inplace-rotate)
|
|
(= inplace-rotate (lambda () (rotate '(c a b))))
|
|
|
|
(inplace-setf-setq)
|
|
(= inplace-setf-setq (lambda () (setf 1 1) (setf ('(A b) 0) 'A)
|
|
(setf (first '(A b c)) 'A) (setf (last '(a b C)) 'C)
|
|
(setf (first "Abc") "A") (setf (last "abC") "C")
|
|
(setf (nth 1 '(a B c)) 'B)))
|
|
|
|
(inplace-sort)
|
|
(= inplace-sort (lambda () (sort '(e q r t w))))
|
|
|
|
(inplace-swap)
|
|
(= inplace-swap (lambda () (swap 123 "abc")))
|
|
)
|
|
)
|
|
|
|
; check if destructive functions return reference to
|
|
; in-place data for modification with other desctructive
|
|
; functions, e.g. setf.
|
|
|
|
(define (qa-inplace-2)
|
|
(and
|
|
(define (foo) (setf (first (push 1 '(2 3 4))) 11))
|
|
(foo) (= (eval (nth '(1 1 1 2) foo)) '(11 2 3 4))
|
|
|
|
(define (foo) (setf (first (push "a" "bc")) "A"))
|
|
(foo) (= (eval (nth '(1 1 1 2) foo)) "Abc")
|
|
|
|
(define (foo) (setf (first (sort '(3 6 4 9))) 11))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) '(11 4 6 9))
|
|
|
|
(define (foo) (setf (first (reverse '(4 3 2))) 11))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) '(11 3 4))
|
|
|
|
(define (foo) (setf (first (reverse "abc")) "C"))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) '"Cba")
|
|
|
|
(define (foo) (setf (first (rotate '(4 3 2 1))) 11))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) '(11 4 3 2))
|
|
|
|
(define (foo) (setf (first (rotate "abc")) "C"))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) "Cab")
|
|
|
|
(define (foo) (setf (first (extend "abc" "def")) "A"))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) "Abcdef")
|
|
|
|
(define (foo) (setf (first (extend '(a b c) '(d e f))) 'A))
|
|
(foo) (= (eval (nth '(1 1 1 1) foo)) '(A b c d e f))
|
|
|
|
(define (foo) (setf (first (replace "c" "abc" "C")) "A"))
|
|
(foo) (= (eval (nth '(1 1 1 2) foo)) "AbC")
|
|
|
|
(define (foo) (setf (first (replace 'c '(a b c) 'C)) 'A))
|
|
(foo) (= (eval (nth '(1 1 1 2) foo)) '(A b C))
|
|
)
|
|
)
|
|
|
|
(if (and (qa-inplace) (qa-inplace-2))
|
|
(println ">>>>> In-place modification passed SUCCESSFUL")
|
|
(println ">>>>> PROBLEM in-place modification passed")
|
|
)
|
|
|
|
(exit)
|
|
|
|
; eof
|
|
|