(define (fakultaet n)
(if (= n 0)
1
(* n (fakultaet (- n 1)))))
爲什麼(fakultaet 3)
給我解決方案(6)而不告訴它打印它?爲什麼DrRacket在if if爲真後輸出我的參數
它是如何在DrRacket中工作的?
(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)
的主程序,因爲它是最後一個表達式。