;;seperate a long line into pieces, each fitting into a smaller line. (define (seperate-line line width) (let loop ((new '()) (old line)) (if (> width (string-length old)) (if (= 0 (string-length old)) (if (equal? new '()) '("") new) (append (list old) new)) (let ((next-line (substring old 0 width)) (rest-old (substring old width (string-length old)))) (loop (cons next-line new) rest-old))))) ;;the result is the "answer" of scsh (define (layout-result-standard result-str width) (reverse (seperate-line result-str width))) ;useful helpers ;;; EK: useful for what= (define (get-marked-positions-1 all-items marked-items) (let loop ((count 0) (result '())) (if (>= count (length all-items)) result (let ((act-item (list-ref all-items count))) (if (member act-item marked-items) (loop (+ count 1) (append result (list (+ count 1)))) (loop (+ count 1) result)))))) (define (get-marked-positions-2 all-items marked-items) (let loop ((count 0) (result '())) (if (>= count (length all-items)) result (let ((act-item (list-ref all-items count))) (if (member act-item marked-items) (loop (+ count 1) (append result (list (+ count 2)))) (loop (+ count 1) result)))))) (define (get-marked-positions-3 all-items marked-items) (let loop ((count 0) (result '())) (if (>= count (length all-items)) result (let ((act-item (list-ref all-items count))) (if (member act-item marked-items) (loop (+ count 1) (append result (list (+ count 3)))) (loop (+ count 1) result)))))) ;;expression as string (define (exp->string exp) (let ((exp-port (open-output-string))) (write exp exp-port) (get-output-string exp-port))) (define (sublist l pos k) (let ((tmp (list-tail l pos))) (reverse (list-tail (reverse tmp) (- (length tmp) k)))))