Common lisp 读取变量的正确输入

Common lisp 读取变量的正确输入,common-lisp,clisp,Common Lisp,Clisp,我希望有一个包含来自用户输入的整数的变量。它既不能接受字符串,也不能接受十进制数 我想要一些帮助来理解我在这里做错了什么 我的代码到现在为止: 我感谢你的帮助 (format t "~%Enter a number: ") (loop (defvar numb (read)) (cond (((rationalp numb)1) (print "No decimal numbers are allowed, please enter an integer")) (((

我希望有一个包含来自用户输入的
整数的变量。它既不能接受字符串,也不能接受十进制数

我想要一些帮助来理解我在这里做错了什么

我的代码到现在为止:

我感谢你的帮助

(format t "~%Enter a number: ")
(loop (defvar numb (read))
(cond (((rationalp numb)1)
        (print "No decimal numbers are allowed, please enter an integer"))
      (((stringp numb)1)
        (print "No strings are allowed, please enter an integer"))
)
(when ((integerp numb)1) (return numb))
)
工作代码 我会这样做:

(defun ask-and-read (prompt)
  "Prompt the user and read his input."
  (princ prompt *query-io*)
  (force-output *query-io*)  ; flush the buffers
  (let ((*read-eval* nil))   ; close the security hole
    (read *query-io*)))

(defun request-object (prompt predicate)
  "Ask the user for an object using prompt.
Only accept data which satisfies the predicate."
  (loop
    for object = (ask-and-read prompt)
    when (funcall predicate object)
    return object
    do (format *query-io* "Alas, ~S (~S) does not satisfy ~S, please try again~%"
               object (type-of object) predicate)))
例如:

> (request-object "Enter an integer: " #'integerp)
Enter an integer: 4.6
Alas, 4.6 (SINGLE-FLOAT) does not satisfy #<SYSTEM-FUNCTION INTEGERP>, please try again
Enter an integer: 5/7
Alas, 5/7 (RATIO) does not satisfy #<SYSTEM-FUNCTION INTEGERP>, please try again
Enter an integer: asdf
Alas, ASDF (SYMBOL) does not satisfy #<SYSTEM-FUNCTION INTEGERP>, please try again
Enter an integer: 7
==> 7
> (request-object "Enter a real: " #'realp)
Enter a real: 4.5
==> 4.5
> (request-object "Enter a real: " #'realp)
Enter a real: 5/8
==> 5/8
> (request-object "Enter a real: " #'realp)
Enter a real: "sdf"
Alas, "sdf" ((SIMPLE-BASE-STRING 3)) does not satisfy #<SYSTEM-FUNCTION REALP>, please try again
Enter a real: 8
==> 8
用于设置变量

与全局变量相比,更喜欢局部变量 虽然Lisp允许全局变量,但主要的编程 Lisp中的样式是函数样式:每个函数都接收其 “输入”数据作为参数,并将其“输出”数据作为值返回。 要实现函数式风格,请选择局部变量而不是全局变量。 通过或在
循环中创建局部变量,请参见

Cond和When有非常具体的语法 您的和表单中有额外的参数和
1
(?!)

记住

安全第一! 绑定到
nil
之前必须 如果用户输入
#(发射核导弹)
响应您的提示,因为通常
read
会计算任何 之后是。

工作代码 我会这样做:

(defun ask-and-read (prompt)
  "Prompt the user and read his input."
  (princ prompt *query-io*)
  (force-output *query-io*)  ; flush the buffers
  (let ((*read-eval* nil))   ; close the security hole
    (read *query-io*)))

(defun request-object (prompt predicate)
  "Ask the user for an object using prompt.
Only accept data which satisfies the predicate."
  (loop
    for object = (ask-and-read prompt)
    when (funcall predicate object)
    return object
    do (format *query-io* "Alas, ~S (~S) does not satisfy ~S, please try again~%"
               object (type-of object) predicate)))
例如:

> (request-object "Enter an integer: " #'integerp)
Enter an integer: 4.6
Alas, 4.6 (SINGLE-FLOAT) does not satisfy #<SYSTEM-FUNCTION INTEGERP>, please try again
Enter an integer: 5/7
Alas, 5/7 (RATIO) does not satisfy #<SYSTEM-FUNCTION INTEGERP>, please try again
Enter an integer: asdf
Alas, ASDF (SYMBOL) does not satisfy #<SYSTEM-FUNCTION INTEGERP>, please try again
Enter an integer: 7
==> 7
> (request-object "Enter a real: " #'realp)
Enter a real: 4.5
==> 4.5
> (request-object "Enter a real: " #'realp)
Enter a real: 5/8
==> 5/8
> (request-object "Enter a real: " #'realp)
Enter a real: "sdf"
Alas, "sdf" ((SIMPLE-BASE-STRING 3)) does not satisfy #<SYSTEM-FUNCTION REALP>, please try again
Enter a real: 8
==> 8
用于设置变量

与全局变量相比,更喜欢局部变量 虽然Lisp允许全局变量,但主要的编程 Lisp中的样式是函数样式:每个函数都接收其 “输入”数据作为参数,并将其“输出”数据作为值返回。 要实现函数式风格,请选择局部变量而不是全局变量。 通过或在
循环中创建局部变量,请参见

Cond和When有非常具体的语法 您的和表单中有额外的参数和
1
(?!)

记住

安全第一! 绑定到
nil
之前必须 如果用户输入
#(发射核导弹)
响应您的提示,因为通常
read
会计算任何
之后出现。

您可能会发现此链接很有帮助。这里有一些有用的例程,你可能会发现这个链接很有用。这里有一些有用的例行公事,非常感谢。解释得很好。是的,在这里询问之后,我一直在尝试,我认为这1是错误的。我认为,为了与一个真实的陈述相匹配,它是需要的。我错了lol感谢againNote在portable CL中打印提示后需要完成输出。可能需要使用
*query io*
进行此类提示。非常感谢。解释得很好。是的,在这里询问之后,我一直在尝试,我认为这1是错误的。我认为,为了与一个真实的陈述相匹配,它是需要的。我错了lol Thank againNote在portable CL中打印提示后需要完成输出。可能需要使用
*query io*
进行此类提示。