当我开始从Practical Common Lisp学习CL时,就像书中所说的那样,我开始使用Allegro CL编译器.我停止使用它,因为它的商业,但免费的位没有给我留下深刻的印象.它需要连接到远程服务器才能获得一些许可.
我切换到'clisp'并使用它.现在,我听说过SBCL并计划开始使用它.
所以,问题是:各种ANSI CL实现有何不同?使用一个在另一个上的任何实际经验?
谢谢.
假设我有一个通用的方法:
T Foo(T x) {
return x;
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是如果它是Hashtable,我想做一些特别的事情.(我知道这是一个完全做作的例子. Foo()也不是一个非常令人兴奋的方法.一起玩.)
if (typeof(T) == typeof(Hashtable)) {
var h = ((Hashtable)x); // CS0030: Cannot convert type 'T' to 'System.Collections.Hashtable'
}
Run Code Online (Sandbox Code Playgroud)
该死.但公平地说,我实际上无法判断这是否应该是合法的C#.那么,如果我尝试以不同的方式做什么呢?
if (typeof(T) == typeof(Hashtable)) {
var h = x as Hashtable; // works (and no, h isn't null)
}
Run Code Online (Sandbox Code Playgroud)
这有点奇怪.根据MSDN,expression as Type是(除了评估表达式两次)相同expression is type ? (type)expression : (type)null.
如果我尝试使用文档中的等效表达式会发生什么?
if (typeof(T) == typeof(Hashtable)) {
var h = (x is Hashtable ? (Hashtable)x : (Hashtable)null); // CS0030: …Run Code Online (Sandbox Code Playgroud) 我创建了一个实现的类ILoadEventListener,并实现了一个OnLoad()方法(当然 - 否则它甚至不会编译).创建"new NHibernate.Cfg.Configuration()"之后,我按照文档说明添加它:
configuration.EventListeners.LoadEventListeners = new ILoadEventListener[] {
new MyListener(),
new NHibernate.Event.Default.DefaultLoadEventListener()
};
Run Code Online (Sandbox Code Playgroud)
然而,它似乎永远不会被调用 - 我已经在我的OnLoad()中添加了日志语句并在调试器中设置了断点 - 即使在使用我的应用程序时,使用此NHibernate会话从数据库中清楚地获取对象厂.
我错过了什么?
编辑:我在源代码中探讨(NHibernate事件文档相当稀疏),并发现对应于IInterceptor的事件实际上是PreLoad,而不是Load,所以我尝试使用它,并且那个确实触发了.所以我现在可以使用它,但我仍然不知道预加载/加载/后加载是什么.