Skip to content
This repository has been archived by the owner on Mar 14, 2019. It is now read-only.

能不能更好地支持Clojure #41

Open
xumingming opened this issue Jun 15, 2012 · 22 comments
Open

能不能更好地支持Clojure #41

xumingming opened this issue Jun 15, 2012 · 22 comments
Labels

Comments

@xumingming
Copy link

Clojure是JVM上的一个语言,但是用HouseMD来调试Clojure代码的话,需要知道Clojure的实现细节: http://www.blogjava.net/killme2008/archive/2012/06/15/380822.html, 如果能够原生支持Clojure那就太好了。可以作为一个单独的命令?或者如果觉得不是核心功能,是否可以作为一个插件插进来?

@zhongl
Copy link
Member

zhongl commented Jun 15, 2012

你的提议太棒了!

HouseMD中每个命令都是一个Command, 可以很容易增加一个cj-loaded之类的命令的.

只不过我是Clojure小白, 不知道该如何定制一个Clojure程序员易用的命令.

马上, 我会增加开发指南的文档 #19 , 让只要会java的程序员, 就可以参与到HouseMD贡献自己更好的命令实现, 比如cj-trace什么的, 呵呵, 你意下如何?

@fuyou001
Copy link

这个好,只要会java就可以参与。

@xumingming
Copy link
Author

恩,挺好的,如果可以的话,我可以来开发这个Command.

@xumingming
Copy link
Author

刚注意到,housemd是用scala写的啊,不会啊。。

@zhongl
Copy link
Member

zhongl commented Jun 15, 2012

没事, Duck就是java实现的, 二者可以混合编译.

@xumingming
Copy link
Author

好,等你开发指南出来后,我来搞搞这个。

@zhongl
Copy link
Member

zhongl commented Jun 20, 2012

开发指南已发布, 期待你的贡献!

@xumingming
Copy link
Author

开发指南里面有一点好像没有涉及到,就是如果我要开发一个插件,我需要继承什么类,需要跟哪些类打交道,这些类的字段之类的是什么意思之类的。从提供的两个Java实现的例子来自己去挖掘这些信息感觉还是有些吃力。

@zhongl
Copy link
Member

zhongl commented Jun 27, 2012

呵呵, 此前不知道该写什么和不写什么, 索性不写等你来问, 这样我就知道写什么了, 哈哈.

文档已经更新了.

@xumingming
Copy link
Author

问一个不大相关的问题。这个软件为什么叫HouseMD? 代码里面为什么会有类叫做Duck, Telephone, MobilePhone...

@xumingming
Copy link
Author

能不能再介绍下Context对象里面的那些字段

@zhongl
Copy link
Member

zhongl commented Jun 27, 2012

已增加Context的解释, 请见文档.

终于等到愿意看我的代码的人问这个问题了, 可把我"憋坏了", 呵呵!

HouseMD是我最爱的一部美剧的名字, 中译名为豪斯医生.

主人翁是个擅长诊断疑难杂症怪叔叔, 他有一句格言:

Everybody lies

他不相信病人所说的话, 因为他们的谎言会误导诊断.

因此, 他诊断的惯例是, 派他的下属(剧中戏称它们为鸭子, 即Duck, 暗指他们是豪斯的跟屁虫)去全方面调查病人(如搜查住所).

而他经常玩消失, 以至于他的小鸭子们要通过电话与他一起会诊病情.

现在, 你应该明白类名为什么古怪了吧, 哈哈哈!

@xumingming
Copy link
Author

文艺青年啊

@xumingming
Copy link
Author

你说要在HouseMD的第55行加一下?没看出来怎么加,这一行是"def run() {"

@zhongl
Copy link
Member

zhongl commented Jun 27, 2012

囧, 行号变过了, 现在是50行,

private lazy val agentOptions = agentJarFile :: classNameOf[Telephone] :: port() :: classNameOf[Trace] :: classNameOf[Loaded] :: classNameOf[Env] :: classNameOf[Inspect] :: Nil
:: Nil前面加入新的指令实现.

@zhongl
Copy link
Member

zhongl commented Jun 27, 2012

你不会是美国办公吧, 我扛不住了, 先躺下了, 晚安.

@xumingming
Copy link
Author

如果要实现一个clj-loaded的command的话,应该只是需要做一些简单参数转换的工作,而真正的实现还是调用你的Loaded命令来完成 -- 因为说到底都是查看某个class是不是loaded,只是clojure自动生成的类名字对于clojure开发来说是不透明的,我只要把clojure开发熟悉的名字转成真正的类名,然后调用你的Loaded实现即可,但是由于你的Loaded是scala实现的,我不确定是否能这么实现?

@zhongl
Copy link
Member

zhongl commented Jun 28, 2012

思路是这样, 但指令是通过反射实例化的, 彼此之间相互独立, 现有的实现无法做到之间相互调用.

我建议:

  1. 先将LoadedScala实现翻译成Java实现;
  2. 在修改过滤allLoadedClasses逻辑;
  3. 实现clj-loaded自己的Completer (这个估计稍微复杂点, 可参考ClassSimpleNameCompleter).

@xumingming
Copy link
Author

这个复杂了。。。感觉插件之间能够相互调用重用实现对于整个插件体系还是蛮重要的,因为很多命令可能都是在另外一个命令上面稍微做些封装,考虑下先把这个点给优化了?

@zhongl
Copy link
Member

zhongl commented Jun 28, 2012

插件上的复用想法, 有道理, 这个需要重新思考, 目前的"很土"的实现还不能称为插件体系. 插件体系要放到0.3.0去做了.

但就clj-loaded特定场景而言, 我觉得插件体系也不能很好解决Completer逻辑在运行态(或实例上)的复用.

@xumingming
Copy link
Author

哦,我懂你意思。插件复用也不一定非要一个command直接调用另外一个command,或者继承之类的。最简单的可能就是把这种逻辑封装到一个对象或者方法里面去,然后所有的command都可以用。

@zhongl
Copy link
Member

zhongl commented Jul 10, 2012

现有版本可参考下面的伪代码形式进行复用:

public class CLLoaded extends Command {

    private final Loaded loaded ;

    public CLLoaded(...) {...} // 省略构造器

    @Override
    public void parse(String[] arguments){
        loaded.parse(transform(arguments));
    }

    public void run() { 
        loaded.run();
    }
}

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

3 participants