Lisp等级到字母的转换

Lisp等级到字母的转换,lisp,common-lisp,Lisp,Common Lisp,问题: Define a LISP function SCORE->GRADE which takes a single argument, s, and returns a symbol according to the following scheme: s ≥ 90 A 73 ≤ s < 77 C+ 87 ≤ s < 90 A– 70 ≤ s < 73 C 83 ≤ s < 87 B+ 60 ≤ s < 70 D

问题:

Define a LISP function SCORE->GRADE which takes a single argument, s, and returns a symbol according to the following scheme:
 s ≥ 90 A           73 ≤ s < 77 C+
 87 ≤ s < 90 A–     70 ≤ s < 73 C
 83 ≤ s < 87 B+     60 ≤ s < 70 D
 80 ≤ s < 83 B      s < 60 F
 77 ≤ s < 80 B–
 If the argument s is not a number then the function should return NIL.
定义一个LISP函数SCORE->GRADE,它接受一个参数s,并根据以下方案返回一个符号:
s≥ 90 A 73≤ s<77摄氏度+
87≤ s<90 A–70≤ s<73摄氏度
83≤ s<87b+60≤ s<70d
80≤ s<83bs<60f
77≤ s<80 B-
如果参数s不是一个数字,那么函数应该返回NIL。
我的答案是:

 (defun SCORE->GRADE (s)
        (if (not (numberp s))  (return-from SCORE->GRADE “NIL”))
        (progn 
        (if (>= s 90) (return-from SCORE->GRADE "A"))
        (if (and (>= s 87) (< s 90)) (format nil “A-“))
        (if (and (>= s 83) (< s 87)) (format nil “B+”))
        (if (and (>= s 80) (< s 83)) (return-from SCORE->GRADE “B”))
        (if (and (>= s 77) (< s 80)) (return-from SCORE->GRADE “B-“))
        (if (and (>= s 73) (< s 77)) (return-from SCORE->GRADE “C+”))
        (if (and (>= s 70) (< s 73)) (return-from SCORE->GRADE “C”))
        (if (and (>= s 60) (< s 70)) (return-from SCORE->GRADE “D”)
        (if (< s 60) (return-from SCORE->GRADE “F”)) 
        )
      )
    )
(德芬分数->等级)
(如果(不是(编号))(从分数返回->评分“零”))
(项目
(如果(>=S90)(从分数返回->等级“A”))
(如果(和(>=s 87)(=s 83)(=S80)(等级“B”))
(如果(和(>=S77)(等级“B-”)返回)
(如果(和(>=s 73)(等级“C+”返回)
(如果(和(>=S70)(等级“C”))
(如果(和(>=S60)(等级“D”)
(如果(等级“F”))
)
)
)
它适用于90,返回A,然后对于其他任何东西,它只给出这个错误,与我输入的变量不同

***-返回源:变量“B”没有值

***-如果:变量“A-”没有值

有人能解释为什么我不能对每一行都得到相同的结果吗


我尝试了message、format t、cases,前3个case中的一些用法,但没有找到任何答案。

您似乎在使用字符
而不是
来包装字符串。

您似乎在使用字符
而不是
来包装字符串。

当您修复双引号的问题时,这里有一些额外的提示:

  • 您通常不需要在Lisp中使用
    RETURN-FROM
  • 最好使用
    COND
    检查多个条件,而不是使用多个
    IF
    语句
  • =
    ,…这样的函数可以接受两个以上的参数
例如,见:

(cond ((not (numberp s)) NIL)
      ((>=    s 90)  "A" )
      ((>= 90 s 87)  "A-")
      ((>= 87 s 83)  "B+")
      ((>= 83 s 80)  "B" )
      ;...
      ((>= 60 s   )  "F" ))

当您修复双引号的问题时,以下是一些额外的提示:

  • 您通常不需要在Lisp中使用
    RETURN-FROM
  • 最好使用
    COND
    检查多个条件,而不是使用多个
    IF
    语句
  • =
    ,…这样的函数可以接受两个以上的参数
例如,见:

(cond ((not (numberp s)) NIL)
      ((>=    s 90)  "A" )
      ((>= 90 s 87)  "A-")
      ((>= 87 s 83)  "B+")
      ((>= 83 s 80)  "B" )
      ;...
      ((>= 60 s   )  "F" ))

除了其他答案,请注意,在您的情况下,您不需要重复公共边界,因为您正试图将分数划分为分数

(cond
  ((>= s 90) "A")
  ((>= s 87) "A-")
  ((>= s 83) "B+")
  ...
  ((>= s 70) "C")
  ((>= s 60) "D")
  (t "F"))

它还减少了代码中必须保留的不变量的数量,这有助于维护。

除其他答案外,请注意,在您的情况下,您不需要重复公共边界,因为您正在尝试将分数划分为分数

(cond
  ((>= s 90) "A")
  ((>= s 87) "A-")
  ((>= s 83) "B+")
  ...
  ((>= s 70) "C")
  ((>= s 60) "D")
  (t "F"))

它还减少了代码中必须保留的不变量的数量,这有助于维护。

我的想法与@coredump相同

(defun SCORE->GRADE (s)
  (cond ((not (numberp s)) nil)
        ((>= s 90) "A")
        ((>= s 87) "A-")
        ((>= s 83) "B+")
        ((>= s 80) "B")
        ((>= s 77) "B-")
        ((>= s 73) "C+")
        ((>= s 70) "C")
        ((>= s 60) "D")
        (t "F")))
这同样可以稍微优雅地表述为:

(defun SCORE->GRADE (s)
  (when (numberp s)
    (cond ((>= s 90) "A")
          ((>= s 87) "A-")
          ((>= s 83) "B+")
          ((>= s 80) "B")
          ((>= s 77) "B-")
          ((>= s 73) "C+")
          ((>= s 70) "C")
          ((>= s 60) "D")
          (t "F"))))

我的想法和@coredump一样

(defun SCORE->GRADE (s)
  (cond ((not (numberp s)) nil)
        ((>= s 90) "A")
        ((>= s 87) "A-")
        ((>= s 83) "B+")
        ((>= s 80) "B")
        ((>= s 77) "B-")
        ((>= s 73) "C+")
        ((>= s 70) "C")
        ((>= s 60) "D")
        (t "F")))
这同样可以稍微优雅地表述为:

(defun SCORE->GRADE (s)
  (when (numberp s)
    (cond ((>= s 90) "A")
          ((>= s 87) "A-")
          ((>= s 83) "B+")
          ((>= s 80) "B")
          ((>= s 77) "B-")
          ((>= s 73) "C+")
          ((>= s 70) "C")
          ((>= s 60) "D")
          (t "F"))))

在您发布的代码中,它看起来像带有
“A”的行
使用的引号与其他引号不同。但我不知道这是否是原因。值得注意的是,到目前为止,所有答案都是错误的,因为他们没有足够仔细地阅读问题。特别是:要返回什么?在您发布的代码中,它看起来像是带有
“A”的一行
使用的引号与其他引号不同。但我不知道这是否是原因。值得注意的是,到目前为止,所有答案都是错误的,因为他们没有足够仔细地阅读问题。特别是:返回的内容是什么?解释了所有内容……我会将其复制粘贴到文本编辑器中,并在那里进行修复,然后将其移到另一个位置我甚至没有意识到它们是不同的。非常感谢你的帮助。解释了一切…我会将它复制粘贴到文本编辑器中,并在那里进行修复,然后将其移动,但我甚至没有意识到它们是不同的。非常感谢你的帮助。