#!/bin/sh # -*- mode: gauche -*- :; exec rlwrap -c --break-chars "'"'(){}[].,#@;|`"' gosh "$@" -- "$0" ;;; ;;; igosh - inferior gauche ;;; ;;; Copyright (c) 2007 OOHASHI, Daichi, ;;; All rights reserved. ;;; ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions ;;; are met: ;;; ;;; 1. Redistributions of source code must retain the above copyright ;;; notice, this list of conditions and the following disclaimer. ;;; ;;; 2. Redistributions in binary form must reproduce the above copyright ;;; notice, this list of conditions and the following disclaimer in the ;;; documentation and/or other materials provided with the distribution. ;;; ;;; 3. Neither the name of the authors nor the names of its contributors ;;; may be used to endorse or promote products derived from this ;;; software without specific prior written permission. ;;; ;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ;;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ;;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ;;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ;;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ;;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ;;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ;;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ;;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; (define-module iutil (use srfi-1) (use gauche.parameter) (export *history-size* repl/history href)) (select-module iutil) (define ids #f) (define history #f) (define *history-size* (make-parameter 10 (lambda (n) (set! history (make-vector n)) (set! ids (apply circular-list (iota n))) n))) (define (repl/history) (read-eval-print-loop #f eval/history #f prompt/id)) (define (eval/history expr env) (receive vals (eval expr env) (vector-set! history (car ids) vals) (pop! ids) (apply values vals))) (define (prompt/id) (format #t "gosh:~A> " (car ids)) (flush)) (define (href i) (let1 j (car ids) (cond ((and (negative? i) (<= (abs i) (*history-size*))) (href (modulo (+ j i) (*history-size*)))) ((< (- j (*history-size*) 1) i j) (apply values (vector-ref history (modulo i (*history-size*))))) (else (errorf "index out of bounds: ~A" i))))) (provide "iutil") (select-module user) (import iutil) (define (main args) (repl/history) 0)