方案对象不适用 - 2 种不同的方式
Scheme object is not applicable - 2 different ways
我正在为 scheme 中的花名册管理程序编写一些代码,但在尝试添加学生时遇到问题。我正在使用一个名册参数,它是一个列表列表,每个子列表都是学生的记录。我添加的第一个学生没有问题,但是当我尝试添加第二个学生时,我收到了相同错误的两个实例之一。
如果我尝试输入应添加的学生,我收到错误消息:
The object ("21" "Anon Ymous" "89") is not applicable.
如果我添加的学生有与现有学生冲突的信息,我会得到错误:
The object (("23" "Anon Ymous" "11")) is not applicable.
本节代码如下:
(define addifnotcontains
(lambda (roster item)
(cond ((null? roster) (list item))
((equal? (car (car roster)) (car item))
(begin
(display "\tID Already Exists\n")
(roster)
))
((equal? (cadr (car roster)) (cadr item))
(begin
(display "\tName Already Exists\n")
(roster)
))
(else (cons ((car roster) addifnotcontains (cdr roster))))
)
)
)
此函数的调用是 (menu (addifnotcontains roster (buildobject 0 '())))
,其中 menu 是一个 lambda 函数,它只接收花名册
我知道这个问题是由于我之前的代码中括号不匹配或放错地方引起的,但这次我不知道为什么会这样。我怀疑它与在开始块末尾调用 (roster)
有关,但据我了解,开始块 returns 是块内调用的最后一个值。我做错了什么?
在第一种情况下,您尝试将 (car roster)
应用于 addifnotcontains
和 (cdr roster)
:
(cons ((car roster) addifnotcontains (cdr roster)))
^ <-- This is one expression --> ^
您也只将一个参数传递给 cons
并且 忘记传递 item
.
这应该是
(cons (car roster) (addifnotcontains (cdr roster) item))
在第二种情况下,您尝试将 roster
作为函数应用。
你是正确的,begin
块的值是块中最后一个表达式的值,但在你的情况下,这个表达式应该是 roster
,而不是 (roster)
.
(请记住,您不能像在某些其他语言中那样在 Scheme 中随意添加括号;括号 始终 很重要。)
我正在为 scheme 中的花名册管理程序编写一些代码,但在尝试添加学生时遇到问题。我正在使用一个名册参数,它是一个列表列表,每个子列表都是学生的记录。我添加的第一个学生没有问题,但是当我尝试添加第二个学生时,我收到了相同错误的两个实例之一。
如果我尝试输入应添加的学生,我收到错误消息:
The object ("21" "Anon Ymous" "89") is not applicable.
如果我添加的学生有与现有学生冲突的信息,我会得到错误:
The object (("23" "Anon Ymous" "11")) is not applicable.
本节代码如下:
(define addifnotcontains
(lambda (roster item)
(cond ((null? roster) (list item))
((equal? (car (car roster)) (car item))
(begin
(display "\tID Already Exists\n")
(roster)
))
((equal? (cadr (car roster)) (cadr item))
(begin
(display "\tName Already Exists\n")
(roster)
))
(else (cons ((car roster) addifnotcontains (cdr roster))))
)
)
)
此函数的调用是 (menu (addifnotcontains roster (buildobject 0 '())))
,其中 menu 是一个 lambda 函数,它只接收花名册
我知道这个问题是由于我之前的代码中括号不匹配或放错地方引起的,但这次我不知道为什么会这样。我怀疑它与在开始块末尾调用 (roster)
有关,但据我了解,开始块 returns 是块内调用的最后一个值。我做错了什么?
在第一种情况下,您尝试将 (car roster)
应用于 addifnotcontains
和 (cdr roster)
:
(cons ((car roster) addifnotcontains (cdr roster)))
^ <-- This is one expression --> ^
您也只将一个参数传递给 cons
并且 忘记传递 item
.
这应该是
(cons (car roster) (addifnotcontains (cdr roster) item))
在第二种情况下,您尝试将 roster
作为函数应用。
你是正确的,begin
块的值是块中最后一个表达式的值,但在你的情况下,这个表达式应该是 roster
,而不是 (roster)
.
(请记住,您不能像在某些其他语言中那样在 Scheme 中随意添加括号;括号 始终 很重要。)