2009-01-26 44 views
3

我在閱讀Paul Graham's A Plan for Spam並且想更好地理解它,但是我的LISP真的很生鏽。他有一個代碼片段,計算概率,例如:將一些LISP轉換爲C#

(let ((g (* 2 (or (gethash word good) 0))) 
     (b (or (gethash word bad) 0))) 
    (unless (< (+ g b) 5) 
    (max .01 
      (min .99 (float (/ (min 1 (/ b nbad)) 
          (+ (min 1 (/ g ngood)) 
           (min 1 (/ b nbad))))))))) 

我的問題是雙重的:(1)是否有一個的網絡資源,將LISP轉換成不同的語言? (我的偏好是一個基於C的語言)或失敗(2)是否有人可以用C#替代我的代碼片段?

+0

編輯此項以表明您嘗試過的以及您不瞭解的內容。現在,這只是一個plzsendtehcodez問題,不會帶來任何答案。 – 2009-01-26 23:25:51

+0

哈哈。我不認爲C#是一種基於C的語言:) – cbrulak 2009-01-26 23:26:43

回答

9

我認爲這是這樣的事情(警告,未來可能出現的錯誤這段代碼的目的是作爲一個指南,而不是一個解決方案。):

var g = 2 * (gethash(word, good) | 0); 
var b = gethash(word, bad) | 0; 

if((g + b) >= 5) 
{ 
    return Math.Max( 
     0.01, 
     Math.Min(0.99, 
      Math.Min(1, b/nbad)/
      (Math.Min(1, g/ngood) + Math.Min(1, b/nbad)))); 
} 
6

添加到Gonzola's answer,不要忘了,Lisp語言提供了無限精度整數和有理數,而C#喜歡截斷。您需要先投入「nbad」和「ngood」才能先浮動以獲得可比(儘管不完全相同)的結果。

您可能還想將整個轉換後的程序放入選中區域。 C#甚至不會對fixnum溢出發出警告 - 第一個近似將會像處理內存受限一樣處理溢出(在Lisp中,如果溢出數量太大以至於無法存儲在內存中,則會出現類似的行爲結果)。

checked { 
    var fbad = (double)nbad; 
    var fgood = (double)ngood; 
    var g = 2 * (gethash(word, good) | 0); 
    var b = gethash(word, bad) | 0; 


    if((g + b) >= 5) 
    { 
     return Math.Max( 
      0.01, 
      Math.Min(0.99, 
        Math.Min(1, b/fbad)/
        (Math.Min(1, g/fgood) + Math.Min(1, b/fbad)))); 
    } 
}