小编use*_*059的帖子

Linux下的MbUnit,在F#项目中使用?

我尝试在gallio-users列表中询问此问题,但问题未能出现(Google Groups称帖子成功).我想这个列表可能会被那些不经常阅读他的电子邮件的人主持:-)看到SO有Gallio和MbUnit的标签,我认为这里值得一提.

我看到MbUnit头版提到他们热衷于维护Mono兼容性.还有一个> 1年的关于gallio用户的帖子说它在Linux下不起作用

如果删除Parallelizable属性,我想测试的项目在Mono下编译得很好.我可以Gallio在Linux下启动控制面板,但不能启动Icarus或Echo.

有没有办法MbUnit在Linux下运行测试?使用命令行(如Gallio.Echo)并且不需要Monodevelop的东西会特别有用.

ubuntu mono mbunit f# gallio

100
推荐指数
1
解决办法
1026
查看次数

为什么F#对堆栈大小施加了限制?

我想知道是否有一个根本原因将F#中的递归深度限制在10000左右,理想情况下如何避免该限制.我认为编写使用O(n)堆栈空间的代码是完全合理的,如果不同意的人可以解释他们为什么这样做,我将不胜感激.非常感谢.我在下面解释我的想法.

我没有看到有任何理由不允许堆栈增长,直到整个可用内存耗尽.这意味着无限递归需要更长时间才能注意到,但并不是说我们不能编写消耗无限内存的程序.我知道可以使用continuation和尾递归将堆栈使用减少到O(1),但我并不特别看到我必须一直这样做是有益的.我也没有看到如何知道函数何时需要处理"大"输入(通过8位微控制器的标准).

我认为这与必须例如使用累积参数以避免二次时间行为有根本的不同.虽然这也涉及担心实现细节,并且不需要为"小"输入完成,但它也是非常不同的,因为编译器本身不能轻易地删除问题.进一步的不同之处在于,稍微复杂的O(n)代码如果天真地写入则是O(n ^ 2)比简单,缓慢,易于阅读的版本更有用.相比之下,延续式代码与相应的天真版本具有完全相同的内存复杂性,但只使用不同类型的内存.这是编译器在这个时代不应该让我担心的事情吗?

虽然我"更喜欢"理论上的原因,为什么不可能有一个深层叠加,我们也可以讨论实际方面.在我看来,堆栈是一种比堆更有效的管理内存的方式,因为它不需要垃圾收集并且很容易被释放?我不确定我是否能看到允许深堆栈的成本.不可否认,操作系统需要留出足够的虚拟空间来包含您可能希望在整个程序中为每个线程堆栈一次使用的所有内存.但那是什么呢.通过这样做,或者硬件制造商不能轻易地将该限制增加到64位,这并不是说我们可能会用尽当前常见的48位限制?

F#没有那么具体.我希望在C#中也适用同样的限制,并且没有看到它在那里更加必要,尽管在以命令式方式编程时,实际上显然不那么痛苦.

非常感谢任何回复/评论.

编辑:我写了以下答案的摘要.

recursion f# tail-recursion

15
推荐指数
3
解决办法
1493
查看次数

记录f#代码的最佳方法是什么?

我已经尝试过使用引导的GUI安装中包含的补丁的Sandcastle,但除非我做了一些非常错误的事情,否则它基本上不适合记录F#代码(即使它对C#非常有效).也许它适用于其他人,在这种情况下,我会非常感谢我可以从一个简短的完整例子开始.非常感谢.

我知道Sandcastle不会输出F#程序集中的所有内容,但是那里引用的项目还没有准备好进入黄金时段.

肯定有一些可靠的工作并且"足够好"的东西?非常感谢任何建议.

编辑:非常感谢所有回复的人.布赖恩的回答最接近我想要的,所以我会接受它.然而,结果是似乎没有一个既适合F#又能可靠运行的解决方案.我现在会坚持使用文字评论.

我希望FsHtmlDoc.exe在某些时候开始工作.虽然我不能排除它已经有效但我只是没有正确使用它,谷歌搜索它表明我不是唯一一个发现它还不完美的人.

sandcastle f#

8
推荐指数
1
解决办法
966
查看次数

如何使NUnit运行未由模块导出的F#测试

我在F#中编写了一个大型模块,恰好有一个简单的界面.该模块包含大约1000行代码,50个单元测试,并只导出一个易于理解的功能.

接下来要做的就是编写一个小的fsi文件.这有许多优点,包括防止命名空间污染,为文档提供明显的位置,确保如果有人决定重用内部,他们将有动力干净地将它们分解出来,毫无疑问,许多其他人.我相信我在这里向合唱团讲道,但仍然觉得值得解释为什么我认为有fsi文件是有帮助的.

现在问题.NUnit将不再运行单元测试,谴责声称它们不公开.那么,那将是因为它们不以任何方式成为界面的一部分.我并不特别希望将它们添加到界面中,尽管如此,因为它意味着每次添加另一个测试时都会更新它,并且它会使fsi文件膨胀一个数量级.

我想一个简单的解决方法是将代码移动到其他地方,将其导入到一个很小的.fs文件中,然后转发一个函数.幸运的是,每个人都会认为这只是令人反感.请问有更好的方法吗?

编辑:非常感谢所有回复的人.我赞同这两个答案.我本来想分开赏金,但是因为这似乎不可能(我有点随意)接受Tomas的回答.

f# nunit

7
推荐指数
1
解决办法
1162
查看次数

从Verilog代码合成的硬件是正确的是什么意思

我读过"Verilog综合中的非阻塞分配,杀死的编码样式!" 作者:Clifford Cummings.他说,这个问题底部的代码"保证"被合成为三个触发器管道,但不保证能够正确模拟(例如pipeb3,第10页;"保证"注释在第12页).该文件获得了最佳论文奖,因此我认为这一说法属实.http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

我的问题:如果没有参考模拟语义,如何定义Verilog综合的正确性?非常感谢.

我认为奖励积分问题是:假设它不是下面的代码,给出最简单的Verilog程序,该程序具有明确定义的合成语义,并且没有明确定义的模拟语义.再次感谢.

事实上,有人可以给我一块Verilog,它在模拟和合成时都有明确定义,但两者产生的结果不同吗?

代码:

module pipeb3 q3, d, clk);
  output [7:0] q3;
  input [7:0] d;
  input clk;
  reg [7:0] q3, q2, q1;

  always @(posedge clk) q1=d;
  always @(posedge clk) q3=q2;
  always @(posedge clk) q1=d;
endmodule
Run Code Online (Sandbox Code Playgroud)

PS:如果有人关心,我虽然对正确的综合工具的合理定义可能与"合成的硬件将做一些正确的模拟器可以做的事情"的方式相符.但这与论文不一致.

[我现在认为这篇论文不对.1364-2001标准的第5.2节明确指出Verilog程序的含义是由其模拟定义的,然后标准继续定义(非确定性和所有).除了模拟器之外,综合工具必须提供的任何"保证"都没有提及.

还有另一个标准1364.1-2002描述了可合成子集.没有明显提到合成硬件的语义应该与模拟有所不同.第5.2.2节"建模边缘敏感存储设备"表示应使用非阻塞分配来模拟触发器.在标准说法中,这意味着不支持使用任何其他内容.

最后一点,前一段中提到的部分说阻塞分配可用于计算非阻塞分配的RHS.这似乎违反了卡明斯的建议#5.

Cliff Cummings被列为1364.1-2002标准工作组的成员.该标准在IEEE网站上被列为替换,但我不知道它被替换为什么.

verilog system-verilog

4
推荐指数
1
解决办法
1602
查看次数

F#中的匿名类

我想在F#中实例化一个匿名类,并定义我自己的哈希/相等.有人可以告诉我怎么样?

在接口中指定Equals/GetHashCode不起作用.可以实例化这些方法,但不能以我能看到的任何方式调用它们.基本上,我想以一种给我一个具有指定哈希函数的对象的方式实例化下面的IBlah接口.我能得到的最接近的是testfixture中的函数"instance",但是会生成使用默认哈希的实例.

我也想知道是否有人可以告诉我如何调用类impl中的"内部"GetHashCode.

提前谢谢了.

open NUnit.Framework

type IBlah =
    abstract anint : int
    abstract GetHashCode : unit -> int

type impl (i:int) =
    interface IBlah with
        member x.anint = i        
        member x.GetHashCode () = failwithf "invoked"
    //override x.GetHashCode () = i

[<TestFixture>]
type trivial () =

    let instance i =
        {
            new IBlah with
                member x.anint = i
                member x.GetHashCode () = failwith "It is invoked after all"
        }

    // this fails (in the comparison, not due to a failwith) …
Run Code Online (Sandbox Code Playgroud)

f#

2
推荐指数
1
解决办法
1375
查看次数

使用阻塞分配来推断Verilog中的触发器

我读过"Verilog综合中的非阻塞分配,杀死的编码样式!" 作者:Clifford Cummings.他说下面的代码(第12页,简化)是教科书中经常使用的触发器的正确​​实现,即使不完全是任何人都应该使用的那种.该文件获得了最佳论文奖,因此我认为这一说法属实.

module ff (q, d, clk)
  output q;
  input d, clk;
  reg q;

  always @(posedge clk)
    q = d;
endmodule
Run Code Online (Sandbox Code Playgroud)

我想知道为什么如果这些触发器中的两个或多个串联连接,这将继续正常工作.说

module two_ffs (q, d, clk)
  input d, clk;
  output q;

  wire tmp;

  ff firstff (tmp, d, clk);
  ff secondff (q, tmp, clk);
endmodule
Run Code Online (Sandbox Code Playgroud)

我看到它的方式,tmp的值可能会在secondff使用之前更新,从而导致一个触发器而不是两个触发器.有人可以告诉我标准的哪一部分说不可能发生?非常感谢.

[不是我会考虑编写这样的代码,我只是想了解阻塞/非阻塞行为,即使在编码风格不好使意义不明显的情况下]

后来添加:

我现在认为这篇论文不太可能是正确的.1364-2201 Verilog标准的第5节"调度语义"解释了会发生什么.特别是,第68页的5.6.6节"端口连接"表示单向端口就像连续分配一样.反过来,连续分配只是对所有事物始终敏感.所以底线是我下面的例子中ff的两个实例相当于一个带有多个always子句的模块,每个人都会同意这个子句被打破.

在Clive Cummings回答问题后添加:

我很感谢CC指出,标准第5部分中的上述陈述仅涉及更新事件的时间,并不意味着例如某些连续分配和总是块之间的字面等效.不过,我认为他们解释了为什么有些模拟器(例如Icarus Verilog)会在"触发器"中产生阻塞和非阻塞分配的不同仿真结果.[在一个更大的例子中,我得到2个具有阻塞分配的明显ffs,正确的5个具有非阻塞分配.]其他模拟器(例如具有默认选项或Cver的Modelsim)似乎产生相同的结果,无论哪种形式使用了赋值.

verilog system-verilog

2
推荐指数
1
解决办法
3402
查看次数