English 中文(简体)
将一些LISP转换成C#。
原标题:
  • 时间:2009-01-26 23:21:38
  •  标签:

我正在阅读保罗·格雷厄姆的垃圾邮件计划,希望更好地理解它,但我的LISP非常生疏。他提供了一个代码片段,用于计算概率:

(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转换为其他语言的Web资源? (我更喜欢基于C的语言)如果失败(2)可以有人帮我用C#重写那段代码吗?

最佳回答

我认为是这样的(警告,可能会有错误。此片段供参考,而非解决方案):

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))));
}
问题回答

补充一下Gonzola回答中的内容,别忘了 Lisp 提供无限精度整数和有理数,而 C# 喜欢截断。你需要首先将 nbad 和 ngood 转换为 float,以获得可比较(虽然不完全相同)的结果。

你可能还想把整个转换后的程序放在一个已检查的区域。 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))));
    }
}




相关问题
热门标签