获取#<;未定义>;调用scheme函数时返回

获取#<;未定义>;调用scheme函数时返回,scheme,Scheme,我在方案中有以下代码: (define (processExpression lst) (define operand (car lst)) (define operator1 (cadr lst)) (define operator2 (caddr lst)) (if (list? operand) (begin (display "Invalid syntax! Erroring out!")

我在方案中有以下代码:

(define (processExpression lst)
     (define operand (car lst))
     (define operator1 (cadr lst))
     (define operator2 (caddr lst))

     (if (list? operand) 
          (begin
             (display "Invalid syntax! Erroring out!")
             (quit)
         )
      )

      (if (and (number? operator1) (number? operator2))
          ;The list was of the form (operand c1 c2)
          (simplePrefix lst)
      )

     (if (and (list? operator1) (number? operator2))
          (begin
             (list operand operator2 (processExpression operator1))     
         )
     )
   )

  (define (simplePrefix lst)

       (let (
         (operand (car lst))
         (operator1 (cadr lst))
         (operator2 (caddr lst)))

         (list operator1 operand operator2)
     )

  )

 (display "Please enter a valid s-expression")
 (let ((input (read)))
     (display (simplePrefix input))
 )
这段代码接受和s表达式,并根据一些规则对其进行转换。一条规则应该是表达式(+(+12)2)应该返回(+2(1+2))

目前,当我使用该表达式调用此代码时,我会返回结果“#unde>”,但我不知道为什么。代码应该在表达式的(+12)部分调用simplePrefix函数并返回(1+2),但它没有。有人知道为什么吗?

(if condition
   something)
如果条件为false,则未定义,因为if表单中没有else部分。在R5RS版本的方案中,说明了这一点(增加了重点):

语法:
(if)

语法:
(if)

语法:
可以是任意表达式

语义:if表达式的求值方式如下:首先,求值。如果它产生一个真值(参见第节 6.3.1),然后进行评估并返回其值。否则,将对其进行评估并确定其值 被退回如果生成一个假值,则为否 则表达式的结果为 未指定。

(if (> 3 2) 'yes 'no)                   ===>  yes
(if (> 2 3) 'yes 'no)                   ===>  no
(if (> 3 2)
    (- 3 2)
    (+ 3 2))                            ===>  1
如果您尝试以下操作,某些类似于Scheme的语言(例如Racket)实际上会警告您:

Welcome to Racket v6.1.
> (if #t
    (display "hello"))
stdin::1: if: missing an "else" expression
  in: (if #t (display "hello"))
  context...:
在Common Lisp中,else部分是可选的,如果未提供,则定义为nil

This is SBCL 1.2.4.58-96f645d, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
* (if t
    (print 'hello))

HELLO 
HELLO
* (if nil
    (print 'hello))

NIL
这是SBCL 1.2.4.58-96f645d,是ANSI Common Lisp的一个实现。
有关SBCL的更多信息,请访问。
*(如果t
(打印“你好”)
你好
你好
*(如无)
(打印“你好”)
无
表达式

(if condition result)
不等于

if condition
   return result
其他语言。
它不返回值,它有一个值。 如果条件为false,则该值未定义。
如果该值后跟序列中的其他表达式,则忽略该值并计算以下表达式

对函数应用程序求值的结果是函数体中最后一个表达式的值

(define (foo) 
  (if (= 1 1)
      "one is one")
  "I am still here")


> (foo)
"I am still here"

这两个加在一起会导致您遇到的错误

从R6RS开始,做副作用条件句的正确方法是使用
when
除非
if
应严格仅用于在C风格语言中使用条件运算符(
?:
)的情况。