Ejemplo.lsp



; ---------------------------------------------------
; Imprime los numero del 1 al 'numero'
; ---------------------------------------------------
(defun ciclo (numero)
  (do ((n 1 (+ n 1)))
    ((> n numero) 'fin)
    (print n)
  )
)

; ---------------------------------------------------
; Muestra los n numeros de fibonacci
; ---------------------------------------------------
(defun fibo (n)
  	(cond
		((eq n  1) 1)
		((zerop n) 1)
		(t (print (+ (fibo (- n 2)) (fibo (- n 1)))))
	)
)

; --------------------------------------------------
; Objetivo: mostrar la tabla de multiplicacion de N
; --------------------------------------------------
(defun Tablas ()
	(write-string "De cual tabla? ")				; Impresion de una cadena
	(setq Tabla (read))						; Se lee el teclado y se almacena en Tabla
	(do								; inicio del ciclo
		((x 1 (+ x 1)))						; valor inicial y el incremento
		((> x 10) 'fin)						; condicion de finalizacion
		(format t "~D x ~D = ~D~%" Tabla x (* Tabla x))		; impresion de una cadena formateada
	)
)

(defun FACT (x)								; Inicio de funcion
	(if (eql x 0) 1							; si es 0 regresa 1
		(* x (FACT (- x 1)))					; si no haz el producto
	)
)

(defun BD ()
	(setq Datos_1 '("camila" "matematicas" 8))
	(setq Datos_2 '("fernando" "calculo" 9))
	(setq Datos_3 '("yo" "matematicas" 7))
	(setq Datos_4 '("paty" "calculo" 8))
	(setq Datos_5 '("rodrigo" "fisica" 3))
	(setq Datos_6 '("panchiux" "fisica" 6))
	(setq Datos_7 '("lupe" "fisica" 5))
	(setq Vector '(Datos_1 Datos_2 Datos_3 Datos_4 Datos_5 Datos_6 Datos_7))
	(setq ciclo 1)
	(loop 
		(cond ((eql ciclo 4) (return)))
		(format t "~%----------------------------~%")
		(format t "1.- Mostrar todos los datos~%")
		(format t "2.- Mostrar personas de una materia~%")
		(format t "3.- Mostrar personas de cierto promedio~%")
		(format t "4.- Salir~%")
		(format t "~%----------------------------~%")
		(format t "Seleccione una opcion~%")
		(setq ciclo (read))

		(cond
			((eql ciclo 1) (MuestraTodo))
			((eql ciclo 2) (xMateria))
			((eql ciclo 3) (Por_promedio))
		)
	)
)

;------------------------------------------------------------------
; Muestra todos los elementos de la lista
;------------------------------------------------------------------
(defun MuestraTodo()
	(format t "~%----------------------------~%")
	(format t "~%Nombre~tMateria~TCalificacion~%")
	(format t "~%----------------------------~%")

	(dolist (Persona Vector)
		(setf Nombre  (car (eval Persona)))
		(setf Materia (car (cdr (eval Persona))))
		(setf Calif   (car (last (eval Persona))))
		(format t "~%~a~t~a~t~d~%" Nombre Materia Calif)
	)
)

(defun xMateria ()
	(write-string "De que materia deseas?")
	(setf Mat (read))
	(setq Materia 'matematicas)

	(dolist (Persona Vector)
		(setf Nombre  (car (eval Persona)))
		(setf Materia (car (cdr (eval Persona))))
		(setf Calif   (car (last (eval Persona))))

		(cond
			((equal (string-upcase Mat) (string-upcase Materia)) (format t "~%~a~t~a~t~d~%" Nombre Materia Calif))
		)
	)
)

; -----------------------------------------------------------------------------
; Obtiene una lista de personas cuya calificacion esta en un rango
; -----------------------------------------------------------------------------
(defun Por_promedio ()
	(write-string "Calificacion minima?")
	(setf CalificacionMinima (read))

	(write-string "Calificacion maxima?")
	(setf CalificacionMaxima (read))

	(dolist (Persona Vector)
		(setf Nombre  (car (eval Persona)))
		(setf Materia (car (cdr (eval Persona))))
		(setf Calif   (car (last (eval Persona))))

		(if (and 
			(>= Calif CalificacionMinima) (<= Calif CalificacionMaxima))
			(format t "~%~a~t~a~t~d~%" Nombre Materia Calif)
		)
	)
)