为什么DrRacket在if if为真后输出我的参数
(define (fakultaet n)
(if (= n 0)
1
(* n (fakultaet (- n 1)))))
为什么(fakultaet 3)
给我解决方案(6)而不告诉它打印它?为什么DrRacket在if if为真后输出我的参数
它是如何在DrRacket中工作的?
DrRacket与许多其他Scheme编程环境一样,通过读取您给出的每个表达式,将当前表达式评估为一个值(如数字,字符串或图像),然后打印出在下一个表达式上再次启动该过程之前,将该值赋给交互窗口。
通过将更简单的表达式放入定义窗口中,您可以自行测试此行为。例如,只需在其中写入一个数字,如103
,然后点击运行按钮;您应该在交互窗口中看到103
打印输出。
球拍,函数的定义((define (my-function ...) ...)
)不是一种表达,所以当它被阅读和评估,它只是增加了对你写的新功能的定义,但它并没有显示出任何价值为了它。相反,它只是读取下一个加括号的表单,将它看到的每个定义添加到其内存并评估(并打印其所见的每个表达式)的值。
在DrRacket它不是一个答案,这一点,因为它依赖于你与DrRacket使用哪种语言:
方案,通过使用#!r5rs
,#!r6rs
获得语言,并在未来#!r7rs
不这样做即使您正在使用DrRacket和IDE进行编程和运行。通常我错过了从IDE上运行时打印顶级表达式的能力,所以我做了一个question about how to enable it。不幸的是,这是不可能的。
在DrRacket的默认语言#lang racket
中,运行程序时会打印每个顶级表达式。即使将程序编译为可执行文件并在球拍外运行,也可以执行此操作。在某种程度上,这也模仿了Common Lisp的顶级水平。其他版本的球拍语言,如#lang lazy
和#lang typed/racket
也会打印顶级表达式。因此,如果你制作一个不打印任何东西的程序,你只需要做一个返回(void)
的主程序,因为它是最后一个表达式。