当前位置:  开发笔记 > 编程语言 > 正文

将一些LISP转换为C#

如何解决《将一些LISP转换为C#》经验,为你挑选了2个好方法。

我正在阅读保罗格雷厄姆的垃圾邮件计划,并希望更好地理解它,但我的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#中的代码片段吗?



1> Gonzalo Quer..:

我认为它是这样的(警告,可能的错误.这个片段是作为指导,而不是解决方案):

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))));
}



2> Aaron..:

再加上Gonzola的答案,不要忘记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))));
    }
}

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有