所以我最近自学了lisp并且一直在搞乱一些程序。我正在尝试编写一个小程序,用于比较用户输入的类列表,并找出哪些可以一起工作。下面是第一部分从用户收集数据并创建一些类的列表。
(defun class-entries ()
(setf Monday 0) ;initializes the days of the week
(setf Tuesday 0)
(setf Wednesday 0)
(setf Thursday 0)
(setf Friday 0)
(setf times 100)
(dotimes (repeating times "You have reached the limit of entries") ;repeats the following for the number of classes that you are comparing
(dolist (dayofweek '(Monday Tuesday Wednesday Thursday Friday)) ;repeats the following for each day of the week
(print (concatenate 'string "Does this class occur on " dayofweek " ?"))
(setf isday (read))
(if (= isday 1) ;prompts the questions if there is a class that day
(progn
(print (concatenate 'string "What time does the class begin on " dayofweek " ?"))
(setf starttime (read))
(print (concatenate 'string "What time does the class end on " dayofweek " ?"))
(setf endtime (read)))
(setf isday 0))
(if (= isday 0) ;Adds the list of (startime endtime) to the current day of week or nil if there isn't a class that day
(setf 'dayofweek '"nil")
(setf 'dayofweek '(starttime endtime))))
(print "What is the title of the class?")
(setf (read) '((mon (Monday)) (tues (Tuesday)) (wed (Wednesday)) (thurs (Thursday)) (fri (friday)))) ;sets a new variable to the values of the classes's hours
(print "Is there another class?") ;repeats the function for another class or ends it
(setf isclass (read))
(if (= isclass 0)
(setf times 0)
()))
(setf times 100)
)
当我评估该函数时,它只返回0并且不显示任何其他内容。我不确定是不是因为我没有使用Listener或者是什么。谢谢。
答案 0 :(得分:0)
我不认为这个问题已经足够详细,但这可能会对你有所帮助,并且有希望成为分解和提示的有用示例。添加一些额外的检查并不难:
(defun prompt (&optional (control "> ") &rest arguments)
"Read a value from STREAM after presenting PROMPT."
(fresh-line *terminal-io*)
(apply 'format *terminal-io* control arguments)
(finish-output *terminal-io*)
(read *terminal-io*))
(defstruct course
(name nil :type symbol :read-only t)
(day nil :type symbol :read-only t)
(start nil :type number :read-only t)
(end nil :type number :read-only t))
(defun prompt-for-course ()
(flet ((except-quit (x)
(if (string-equal (princ-to-string x) "quit")
(return-from prompt-for-course nil)
x)))
(let (name day start end)
(setq name (except-quit (prompt "course name: "))
day (except-quit (prompt "course day: "))
start (except-quit (prompt "start time: "))
end (except-quit (prompt "end time: ")))
(make-course :name name
:day day
:start start
:end end))))
(defun prompt-for-courses ()
(loop
with courses = (make-hash-table)
for course = (prompt-for-course)
while course
do (push course (gethash (course-day course) courses))
finally (return courses)))
CL-USER> (prompt-for-courses)
course name: intro-logic
course day: monday
start time: 1100
end time: 1250
course name: intermediate-logic
course day: tuesday
start time: 1100
end time: 1250
course name: quit
#<HASH-TABLE :TEST EQL :COUNT 2 {1003EA6513}>