所以我的函数有3个存储数据的变量(x,y,z), 我的函数看起来有点像这样,它是递归的。
(define (scoreboard)
(define x (read))
(define y (read))
(define z (read))
(cond
[(eof-object? x) empty] ... (scoreboard)
问题也在告诉我: 为Simon游戏实现记分牌。记分板应从标准输入读取一系列命令,并按命令指定生成输出:
score symbol number
Record number as the score for the player whose name is symbol. No output is produced. Assume number is an integer between -999999999 and 999999999.
best symbol
Output a line containing best symbol number where number is the best score recorded so far for the player whose name is symbol.
Output ? instead of number if no score has been recorded for the player.
highscore
Output a line containing highscore number where number is the highest score recorded for any player so far. Output highscore ? if no score has been recorded.
Sample Input:
score Fred 10
score Wilma 20
score Fred 20
highscore
score Betty 30
highscore
best Fred
score Fred 25
best Fred
best Barney
Output for Sample Input:
highscore 20
highscore 30
best Fred 20
best Fred 25
best Barney ?
跟踪输入我看到x =得分,y = betty,z = 30,而x =高分,y =最好,z = fred .. 我的问题是,是否有可能在我点击后输入x = best和y = fred,而不是它的方式呢?
答案 0 :(得分:2)
庵。这个问题背后似乎有一些错误的假设。简短回答"否" (虽然我确定一些聪明的阴谋家可以证明我错了),但让我看看我提到的那些假设。
您通常不想这样做。在像您这样的情况下,您需要复杂的输入,您需要将这些问题分成两个功能。一个用于获取和组织输入,一个用于实际生成记分板派生对象。类似的东西:
(define scoreboard (x y z)
(cond ((eof-object? x) empty) ...))
; not sure what returning the function
; at the end was supposed to do
(define scoreboard-input ()
(let ((x (read)))
(cond ((string=? x "score") (list x (read) (read)))
((string=? x "highscore") x)
...)))
让用户记住你的电路板使用的格式并不是一个好主意。这是一个事实的症状,即你试图让一个功能做得太多(如果我正确理解它,它会尝试接受新的记分板条目并输出一个已排序的板)。少数国家可能是你的朋友;为了整合一个合适的记分牌,我设置了一个跟踪数据的地方,并为用户提供了一些功能,可以简单而一致地操作它(好吧,我是白天的Common Lisper,所以我&# 39; d使用方法,但仍然)。
(define *board* '())
(define (new-entry scoreboard player score)
(set! scoreboard (cons (player . score) scoreboard))
(define (show-scores scoreboard)
(let ((highest (car scoreboard))
(rest (cdr scoreboard)))
(printf "High Score: ~a at ~a" (car highest) (cdr highest))
(map (lambda (entry)
(printf "Player: ~a ~n Score: ~a" (car entry) (cdr entry)))
(sort scoreboard #:key cdr >))))
以这种方式分解,并不需要读取非结构化输入。您可以使用new-entry
函数添加新分数,使用show-scores
输出当前的董事会状态。你可能想要比我更进一步地分解它,实际上,分离出一个函数来获得一个排序的板,也可能是为了得到顶级名称。
回复您的修改:
是的,即使更改了参数,我的评论仍然适用。
你肯定希望以某种方式保留scoreboard
(最好的存储方法留给读者练习;我使用上面的alist
,但你可以使用哈希,或者树,或对象/对象列表,或者一对序列也是如此),并且你想要为它实现三个函数
(defun (record-score! scoreboard name score) ...)
=> nil
,将得分添加到记分板 (defun (best-score-by scoreboard name) ...)
=> (list name score)
或"?"
(defun (high-score scoreboard) ...)
=> score
然后编写一个读取器函数,该函数接受用户输入并根据需要返回其中一个操作的格式化输出。你肯定不想写一个巨人cond
,除非你因为某种原因喜欢头痛。