获取#<;未定义>;调用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风格语言中使用条件运算符(?:
)的情况。