2013-02-11 37 views
1

所以我的新方案。我試圖做一個定義使用形式的規範全局函數的函數((名稱:名稱)(參數:參數)(機身:機身)),所以例如計劃(漂亮的大):使用列表來定義參數

(fn-maker '((name: mult5) (x) (* x 5))) 

將使其在全球如此我可以打電話給

(mult5 3) 

,並得到15

這是我到目前爲止有:

(define (fn-maker fn-spec) 
     (let* (spec (map cdr fn-spec)) 
       (name (caar spec)) 
       (args (cadr fn-spec)) 
       (body (caaddr (cdaddr fn-spec)))) 
     (lambda (args) 
      body))) 

m個目前我困惑的是如何讓lambda使用這些參數。按照現狀,lambda創建一個名爲「args」的新局部變量,而不是評估args後面的列表。有沒有解決的辦法?我目前的思考過程是,我應該在args提供的列表中使用某種形式的表達式,但是我不確定它會是什麼樣子,甚至不知道如何去構建它。

這是家庭作業,所以我絕對不是找代碼(作弊和所有的),而是在正確的方向和一些批評的一點。謝謝。

更新:爲了任何人誰在未來一旦出現這種情況,就可以做到這一點的代碼非常簡單地使用一些巧妙的引用。不需要宏。另外,事實證明,Pretty Big中的eval默認情況下會在全局中評估。

+0

說明書是否提供了關於您或不允許使用哪些功能或特殊表格的規則?而且,製造商真的應該是一個功能,因爲你可以通過它來應用或映射? (如果後者是真的,我不知道如何在不使用eval的情況下做到這一點。) – pnkfelix 2013-02-12 01:20:26

+0

另外,在這個其他問題上還有一些相關的討論:http://stackoverflow.com/questions/1894610/can -i-define-a-global-from-inside-a-procedure-in-scheme – pnkfelix 2013-02-12 01:39:48

+0

對於規則,測試程序將打電話給形式(fn-maker fn-spec),然後是(無論 - 名稱是一些參數)。我們不允許使用set!和朋友或任何明確的循環功能(遞歸是好的)。 – JPatnode 2013-02-12 01:49:47

回答

0

您需要一種方法來「出口」的過程中創建一個函數的定義,這樣的定義存在外,對全球環境。到目前爲止,您的實施只會返回lambda表單。提示:有一種方法可以做到這一點(我記得在Racket中看到它),但它可能是特定於正在使用的Scheme解釋器;而且我不確定它是否可以使用Pretty Big語言。

作爲一個側面說明 - 如果fn-spec參數是要接收列表的名稱和新功能的身體,然後確保只有一個參數傳遞調用fn-maker,像這樣的時候:

(fn-maker '((name: mult5) (x) (* x 5))) 

另外,考慮使用宏,而不是一個簡單的過程...

+0

我正在用DrRacket的漂亮大版本做這個,所以也許它在那裏(還沒有找到它,但仍然在尋找)。看起來我在我的例子中放棄了一個家長,現在修好了。它應該是一個列表。宏看起來像是一個非常有用的方法,我仍然在弄清楚它們的細節(以前從未聽說過),但非常感謝。 – JPatnode 2013-02-12 01:46:13

1

有一個叫eval一個計劃程序,可以用來評估你構造任意代碼。

它的使用通常是不鼓勵的(就像在JavascriptRuby中一樣),因爲它被使用很多次,所以當更強大的替代品可用時,它被用作不安全的捷徑。 (一個簡單的例子是,當有人可能會使用(eval name)查找在全球環境中,名字是從預定的一組符號繪製的符號相關聯的值;在這種情況下,它往往是更好的風格來構建一個單獨的查找表所有感興趣的符號,而不是顛覆全球環境用於這一目的。

不管怎樣,在一些計劃系統,eval可用於注入新的定義到全球的環境。我必須添加限定符「some」,因爲在R5RS中,eval過程同時採用表達式和環境來評估表達式,並且實現不需要爲此提供交互式全局環境。 (即,interaction-environment可選過程。)

這裏是經由eval注入一個全局變量的圖示時interaction-environment提供:

(define (make-it-three name) (eval (list 'define name '3) (interaction-environment))) 

;; At the REPL now 

> (make-it-three 'x) 

> x 
3 

> (map make-it-three '(a b c)) 
(#!unspecified #!unspecified #!unspecified) 

> (+ a b c) 
9 

Racket(以及漂亮的大,我認爲),他們不提供interaction-environment。但我認爲那裏有一個不同的程序可以用來實現這個目標;檢查文檔。

無論如何,這只是一種試圖提供一個小記錄在一個策略,可能會或可能不會導致你在正確的方向。強調「不可以」。