Subversion Repositories programming

Rev

Rev 431 | Blame | Compare with Previous | Last modification | View Log | RSS feed

; HW04.lisp - Homework Assignment #4 for CS408, Fall Quarter, 2006
; Copyright (c) 2006 Ira W. Snyder (devel@irasnyder.com)
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in all
; copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
; SOFTWARE.

;;; Problem 1
;;;
;;; The example output given in the homework assignment page is incorrect,
;;; according to the description. The description states that we should keep
;;; anything that is strictly less than LO, and strictly higher than HI. The
;;; example output for (list_outliers 10 3 '(3 5 1 9 11 30)) contains 3, which
;;; is incorrect, since it is not strictly less than LO, which is 3.
(defun LIST_OUTLIERS (HI LO LI)
  (cond
    ((null LI)                            nil)
    ((or (< (car LI) LO) (> (car LI) HI)) (cons (car LI) (LIST_OUTLIERS HI LO (cdr LI))))
    (t                                    (LIST_OUTLIERS HI LO (cdr LI)))
  )
)

;;; Problem 2
(defun dolist_reverse (LI)
  (let ((RES nil))
    (dolist (EL LI RES)
      (setq RES (cons EL RES))
    )
  )
)

; The real way I'd do it, using a do-loop instead of dolist
(defun DO_REVERSE (LI)
  (do ((RES nil (cons (car LI) RES))
       (LI  LI  (cdr LI)))
      ((null LI) RES)
  )
)

;;; Problem 3
(defun DO_FACTORIAL (NUM)
  (do ((NUM NUM (1- NUM))
       (RES 1 (* RES NUM)))
      ((<= NUM 0) RES)
  )
)

;;; Problem 4
(defun DO_MEMBER (EL LI)
  (do ((LI LI (cdr LI)))
      ((or (null LI) (equal (car LI) EL)) LI)
  )
)

; vim: set ts=2 sts=2 sw=2 expandtab textwidth=80: