2016-05-16 30 views
4

我目前正在學習Scheme(使用球拍),但是我遇到的挑戰之一是試圖執行以下代碼,這意味着要執行球拍代碼從用戶輸入使用eval無法在球拍上對用戶輸入使用eval

(display (eval (read))) 

 

這裏有一些怪異的行爲至今我觀察到的:

  1. 定義窗口中的提示鍵盤輸入,如預期的那樣運行定義。然而,提供輸入
    ((lambda (x) (+ x 1)) 1)
     
    給出了錯誤
    ?: function application is not allowed; no #%app syntax transformer is bound in: ((lambda (x) (+ x 1)) 1)

  2. 在另一方面,使用(display ((eval (read)) 1))並提供輸入
    (lambda (x) (+ x 1))
     
    返回錯誤
    lambda: unbound identifier; also, no #%app syntax transformer is bound in: lambda

  3. 但是,在控制檯窗格中運行(display (eval (read)))並提供((lambda (x) (+ x 1)) 1)(與定義窗格相反)會按預期打印出2

這種行爲的原因是什麼?

+0

我想知道,你使用'eval'是因爲你好奇,還是你想做一些你不知道該怎麼做的事情? –

+0

@Alex我使用'eval'是因爲我很好奇,並不是因爲我試圖做任何解決方法。 – Edwin

+0

嘿,埃德溫只是一個領導,球拍是與計劃不同的語言,不只是一個計劃方言。 (就像C++是一種與C不同的語言,即使它們看起來各不相同)。正如Alex的答案所指出的那樣,解決方案與Scheme中解決此問題的方案會有很大的不同,因爲它們都有不同的語法和評估模型。因此,我將更新此問題以刪除方案參考,因爲它們不相關。如果您寧願讓他們隨時撤消該編輯。 :) –

回答

7

看起來你沒有設置命名空間。如果在文件中運行(eval (read)),則它不起作用,因爲current-namespace默認設置爲空名稱空間。您可以通過執行(current-namespace (make-base-namespace))首先建立在它racket/base命名空間:

#lang racket 
(current-namespace (make-base-namespace)) 
(println (eval (read))) 

運行此程序,並給它在它印刷2輸入((lambda (x) (+ x 1)) 1)結果。

它在交互窗口(怪異行爲列表的項目3)中工作的原因是,在交互窗口中,current-namespace參數設置爲文件的名稱空間。

這不是定義窗口,主程序真實的,所以你要自己設置current-namespace,或通過一個命名空間作爲第二個參數eval

#lang racket 
(define ns (make-base-namespace)) 
(println (eval (read) ns)) 
+0

有趣。這解決了它。 – Edwin

1

球拍,軟件包支持R5RS和R6RS,並可能獲得對R7RS的支持。該軟件在其自己的Racket語言族中也有幾種非標準語言,與Scheme有很多共同之處,但不是Scheme。亞歷克斯已經爲這種語言做出了很好的回答,所以我雖然會添加關於Scheme的信息,因爲你寫你正在學習Scheme,它與學習Racket不同,當涉及到一些角落案例時,包括eval

eval是一個過程,在不同的Scheme報告之間發生了重大變化,因爲它在R5RS中變得強制性。以下是不同版本的標準的一些例子:

#!r6rs 

(import (rnrs) 
     (rnrs eval)) 

(display (eval '((lambda (x) (+ x 1)) 1) 
       (environment '(rnrs)))) 
; ==> undefined, prints 2 

年齡稍大,但仍共同使用R5RS:

#!r5rs 

(display (eval '((lambda (x) (+ x 1)) 1) 
       (scheme-report-environment 5))) 
; ==> undefined, prints 2 

的來R7RS其中只有它的小版本批准至今:

#!r7rs 

(import (scheme) 
     (scheme eval)) 

(display (eval '((lambda (x) (+ x 1)) 1) 
       (environment '(scheme)))) 
; ==> undefined, prints 2