diff --git a/Makefile.am b/Makefile.am index 6269967..7d4ce2f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -54,6 +54,7 @@ MODULES = \ geesh/built-ins/read.scm \ geesh/built-ins/readonly.scm \ geesh/built-ins/set.scm \ + geesh/built-ins/shift.scm \ geesh/built-ins/true.scm \ geesh/built-ins/unset.scm \ geesh/built-ins/utils.scm \ diff --git a/geesh/built-ins.scm b/geesh/built-ins.scm index 7dd14b5..e165e44 100644 --- a/geesh/built-ins.scm +++ b/geesh/built-ins.scm @@ -43,7 +43,7 @@ ("readonly" . ,(@@ (geesh built-ins readonly) main)) ("return" . ,undefined) ("set" . ,(@@ (geesh built-ins set) main)) - ("shift" . ,undefined) + ("shift" . ,(@@ (geesh built-ins shift) main)) ("times" . ,undefined) ("trap" . ,undefined) ("unset" . ,(@@ (geesh built-ins unset) main)))) diff --git a/geesh/built-ins/shift.scm b/geesh/built-ins/shift.scm new file mode 100644 index 0000000..5146919 --- /dev/null +++ b/geesh/built-ins/shift.scm @@ -0,0 +1,50 @@ +;;; The Geesh Shell Interpreter +;;; Copyright 2018 Timothy Sample +;;; +;;; This file is part of Geesh. +;;; +;;; Geesh is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; Geesh is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with Geesh. If not, see . + +(define-module (geesh built-ins shift) + #:use-module (geesh environment) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1)) + +;;; Commentary: +;;; +;;; The 'shift' utility. +;;; +;;; Code: + +(define (main . args) + (match args + (() (main "1")) + ((n-string) + (let ((n (string->number n-string))) + (cond + ((and n (exact? n) (>= n 0) + (<= n (length (cdr (program-arguments))))) + (set-program-arguments + (cons (car (program-arguments)) + (drop (cdr (program-arguments)) n))) + EXIT_SUCCESS) + (else + (format (current-error-port) + "~a: shift: Invalid option ~s.~%" + (car (program-arguments)) n-string) + EXIT_FAILURE)))) + (_ (format (current-error-port) + "~a: shift: Invalid options ~s.~%" + (car (program-arguments)) args) + EXIT_FAILURE)))