我想你知道这是什么时候。
[穿上code-review帽子/]
首先,在我们开始之前别的,您使用的是什么版本的球拍?
我在这里得到了5.2.1,所以我可能有点落后,但nth
和write-line
似乎并没有在这里定义函数。我想你想要的是list-ref
和write
。请注意,list-ref
具有不同的参数顺序,并且期望列表中的索引为零。换句话说,就是(list-ref (list 1 2 3) 0) => 1
。因此,你很可能想定义pick-random
为
(define (pick-random lst)
(list-ref lst (random (length lst))))
也有几个不确定的功能有,我想你在你的程序(hedge
,qualifier
和change-person
)其他地方的定义。我会在进一步的评论中忽略这些。
奥斯卡提到,random
发生在1到4294967087.的整数,这意味着你要传递一个数字来之前,考虑到这一点。请注意,(random n)
似乎返回0
和(- n 1)
之间的整数,因此您不需要自己添加或减去一些东西,以便从列表中获取随机元素。
(define (pick-random lst)
(if (null? lst)
lst
(list-ref lst (random (length lst)))))
作为user448810提到,你不想重新计算random-of-three
,因为这不会给你的正在取得每一个选择概率相等。既然你会预先计算它,你可能根本不需要random-of-three
函数。
(define (reply user-response earlier-responses)
(let ((rand (random 3)))
(cond ((= rand 0)
(append (qualifier)
(change-person user-response)))
((= rand 1)
(hedge))
(else
(append (write '(earlier you said that))
(pick-random earlier-responses))))))
write
实际上并不返回任何东西。它只是给REPL打印一些东西,所以reply
函数的else
子句不能代表你的意思,除非write-line
与write
做了一些根本性的不同。
(else
(append (write '(earlier you said that))
(pick-random earlier-responses)))
要么你想
(else
(write '(earlier you said that))
(write (pick-random earlier-responses)))
如果你只是想打印输出,或
(else
(let* ((res (list '(earlier you said that) (pick-random earlier-responses))))
(write res)
res))
如果你的意思是什么地方保留以备将来使用的返回值。
下,这可能是最大的错误我看到和最容易计划新手做(所以不要心疼),你不改变earlier-responses
任何地方。在doctor-driver-loop
(else (list user-response earlier-responses)
(write (reply user-response earlier-responses))
(doctor-driver-loop name earlier-responses))
else子句创建一个新的列表与user-response
为头部和earlier-responses
的尾巴,但是你不对它做任何事。您也不会在下一次致电doctor-driver-loop
时传递不同的值。如果你真的想跟踪输入历史,你会想,要看起来像
(else (write (reply user-response earlier-responses))
(doctor-driver-loop name (list user-response earlier-responses)))
但将不太做你似乎什么希望它无论是。以上将始终将一个两元素列表传递给驱动程序循环的下一次迭代;第一个元素是最近的响应,第二个元素是earlier-responses
。
> (list '(I need a perscription) '((how are you doing?) (hello)))
((I need a perscription) ((how are you doing?) (hello)))
> (list '(are you even listening?) '((I need a perscription) ((how are you doing?) (hello))))
((are you even listening?) ((I need a perscription) ((how are you doing?) (hello))))
你最好什么真正想,如果你希望能够挑选使用pick-random
随机响应过去,是所有响应的平面列表。这意味着cons
新的回应,而不是list
他们。
> (cons '(I need a perscription) '((how are you doing?) (hello)))
((I need a perscription) (how are you doing?) (hello)))
> (cons '(are you even listening?) '((I need a perscription) (how are you doing?) (hello)))
((are you even listening?) (I need a perscription) (how are you doing?) (hello))
所以你else
条款应
(else (write (reply user-response earlier-responses))
(doctor-driver-loop name (cons user-response earlier-responses)))