为什么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)的主程序,因为它是最后一个表达式。