显然还没有完成,但我想要做的是从用户那里获取输入并搜索列表中的数字或字符串。 如果我只使用数字,它工作正常,但如果我使用字符串则失败。 我怎样才能做到这一点?
谢谢。
我的代码失败了
Enter student name or ID : damien
. . string=?: contract violation
expected: string?
given: damien
argument position: 1st
other arguments...:
damien
导致问题的部分有一个指向它的carret
(define (student l s)
(cond
((and (number? s) (= (car (car l)) s))
(newline)
(display "ID=")(display (car (car l)))
(display ", Name=")(display (car (cdr (car l))))
(display ", Grade=")(display (car (cdr (cdr (car l)))))
(newline)
)
->((string=? (car (cdr (car l))) s)
(newline)
(display "ID=")(display (car (car l)))
(display ", Name=")(display (car (cdr (car l))))
(display ", Grade=")(display (car (cdr (cdr (car l)))))
(newline)
)
((null? l) (display "Student not found")(newline))
)
)
(define (display-student l)
(display "Enter student name or ID : ")
(student l (read))
)
答案 0 :(得分:2)
read
读取列表结构,就像方案的源代码一样。因此read
将读取一个字符串,如果它用双引号括起来的话。没有它,它会认为它是symbol
。也许read-line
更适合通用字符串输入?
答案 1 :(得分:0)
就像你对cond
的第一个句子(调用number?
)所做的那样,你需要对第二个句子做同样的事情:
将(string=? ...)
替换为
(and (string? (car (cdr (car l))))
(string? s)
(string=? (car (cdr (car l))) s))
执行此操作后,可能会出现其他错误,但您仍可以继续。例如,如果用户只键入名称(不带引号),read
函数将返回symbol?
。但是如果用户输入两个名字,比如'Ron Paul',作为第一个+最后一个,那么你将获得意想不到的结果。