可能 'exit' 过早地吵架

Possible to 'exit' racket prematurely

为了短路 C 函数(例如,出于测试目的),我可以在其中放置一个早期的 return。例如:

int main(void) {
    puts("Hello");
    return;

    ...bunch of other code...
}

或者在python中做一个sys.exit(0)。有没有办法在 DrRacket / Scheme 中做到这一点?通常我会有一个包含几百行代码的工作簿,我只希望前几个函数在退出前达到 运行。例如:

#lang sicp

(define (filtr function sequence)
  (if (null? sequence) nil
      (let ((this (car sequence))
            (rest (cdr sequence)))
        (if (function this) (cons this (filtr function rest))
            (filtr function rest)))))
              
(filtr  (lambda (x) (> x 5)) '(1 2 3 4 5 6 7 8 9))   
     
(exit)  ; ?? something like this I can drop in to terminate execution?

...200 more lines of code...

这里有办法吗?

#lang racket 可以使用名为... exit 的函数来做到这一点。尝试:

#lang racket

(display 1)
(exit 0)
(display 2)

#lang sicp 没有 exit,但您可以从 Racket 中获取它:

#lang sicp

(#%require (only racket exit))

(display 1)
(exit 0)
(display 2)

函数的早期 return 可以使用延续来完成。例如,使用 let/cc 运算符:

#lang racket

(define (fact x)
  (let/cc return
    (if (= x 0)
        1
        (begin
          (display 123)
          (return -1)
          (display 456)
          (* x (fact (- x 1)))))))

(fact 10)
;; display 123
;; and return -1

或等同于 call-with-current-continuation,它同时存在于 #lang racket#lang sicp 中:

(define (fact x)
  (call-with-current-continuation
   (lambda (return)
     (if (= x 0)
         1
         (begin
           (display 123)
           (return -1)
           (display 456)
           (* x (fact (- x 1))))))))