我已经看到一些线程涉及OCaml中的GUI编程,但我不认为它们在需要GUI界面时会明确地导致明确的解决方案.
我的问题,更具体地说,如下:在为OCaml软件编程GUI时,最有效(也很容易上手)的方法是什么?有没有人接触到OCaml本身的简单有效的GUI模块,或者找到了一个有效的语言或免费软件包,可以在其中完成这个并与OCaml进行良好的通信/播放?
我在OCaml中编写了一个解释器,所以我的词法分析器,解析器,核心解释器函数等都是OCaml模块.目前,我有一个命令行解决方案("main.ml"),它允许用户通过在命令行中键入表达式并接收显示已解析和缩减表达式等的打印终端输出来与解释器交互.但是,命令行解决方案仅用于测试目的.我希望用户通过GUI进行交互,它可以很简单(很久以前就会想到Java框架),但需要以某种方式与我编码的OCaml模块进行交互.到目前为止我在OCaml中找到了一个库:http: //caml.inria.fr/pub/docs/manual-ocaml-4.00/manual042.html.有谁知道这是否有效和有用?(我想我已经对这个图书馆发表了负面评论)
如果我选择用更优的语言编写GUI,那么软件交互是:用适当的语言编写GUI(可能是C++,Python等),然后将OCaml编写的解释器编译成可执行文件,然后以某种方式连接GUI可执行文件?我对一些松散连接或奇怪的解决方案感兴趣,通过管道(我一直在考虑这些的进程间通信,例如操作系统设计中涉及的内容)或套接字(我倾向于将这些用于网络编程),I想象如果不是OCaml本身,必须有某种方法将我的OCaml编码的解释器"容纳"在另一种语言的GUI代码中.有什么想法,指导或建议吗?
编辑:如果我能获得类似Linux的操作系统(即Linux RedHat)的GUI,我会很高兴.如果我可以让GUI在Windows上工作那将是很棒的,但至少我的目标是Linux.
编辑2:刚发现这个,有没有人对"OCaml-Java"有什么看法? http://ocamljava.x9c.fr/ 这听起来很有意思,因为它具有"...运行使用ocamlc编译的Objective Caml源的能力;其次,能够将Objective Caml源编译成可执行的jar文件".我担心的是,从来没有让我觉得Java是获得快速但有用的GUI的最佳方式......
当前的解决方案:在检查了@Jeffrey Scofield在下面提到的解决方案帖子中的各种选项之后,我选择了目前更深入的LablGtk(这将允许我留在OCaml中).对于那些关注这篇文章的人来说,下一个有希望的选择是研究外语与C的接口,因为C和OCaml已经开始有关系了.似乎有一些方法可以在C语言中调用OC代码和OCaml中的C代码(尽管这可能非常困难,因为您实际上最终会使用一些复杂的包装函数包装OCaml函数调用,这些函数将更加特定于您调用的函数类型在OCaml中 - >即你必须处理每个OCaml函数的"映射"及其在C)中的参数.请查看:http: //www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html,了解更多信息.OCaml-Java最初看起来像一个好主意,因为我对Java GUI编程感到满意,但两种语言之间的交互并不像C和OCaml那样直接,而且,这方面的文档似乎很小(并使用OCaml) -Java不是你刚接到的东西,而是获得Java GUI的东西......).OCaml-JavaScript看起来很有趣,但请记住,如果您选择此路径,除了一些JavaScript之外,您很可能不得不花时间在良好的HTML 5编码设置上.或者,SO中有几个帖子讨论管道和套接字,它们是创建GUI后端系统的有效方法.但是,如果您不介意您的程序系统/产品将"松散耦合",这是一个好主意.一旦我弄清楚LablGtk并确保它为我的OCaml后端代码产生可接受的GUI前端,我将更新此解决方案.
我正在尝试使用POSIX(扩展)正则表达式创建一个正则表达式,我可以在我的C程序代码中使用它.
具体来说,我想出了以下内容,但是,我想在匹配的表达式中排除"http"这个词.经过一些搜索,看起来POSIX并不像捕获特定字符串那样明显.我在下面的例子中使用了一个叫做"负面看起来"的东西(即(?!http :)).但是,我担心这可能只是POSIX以外的方言中定义的正则表达式可用的东西.是否允许否定前瞻?POSIX中是否允许使用逻辑NOT运算符(即!)?
工作正则表达式示例:
href|HREF|src[[:space:]]=[[:space:]]\"(?!http:)[^\"]+\"[/]
如果我不能像其他方言那样使用负面预测,我可以对上面的正则表达式做什么来过滤掉特定的单词"http:"?理想情况下,有没有任何方法没有逆逻辑,并最终在过程中创建一个荒谬的长正则表达式?(我上面的那个已经很久了,如果可能的话我宁愿看起来不那么混乱)
[注意:我已经在Stack Overflow中查阅了其他相关的主题,但最相关的主题似乎只是"一般地"提出这个问题,这意味着给出的答案并不一定意味着它们在另一个或两个主题中是POSIX风格的==> ,我已经看到了上面的 (?!insertWordToExcludeHere) 负面预测,但我担心它只适用于PHP.)
[注2:我将采取任何POSIX正则表达式措辞,任何帮助将不胜感激.有没有人建议过滤掉"http:"的正则表达式是什么样的,以及它如何适合我当前的正则表达式,取代(?!http :)?]
我想测试一下我针对相当大的Lambda Calculus表达式测试集编写的Lambda Calculus解释器。有谁知道我可以使用的Lambda Calc表达式生成器(在Google上进行首次搜索后找不到任何内容)?这些表达显然必须适当地形成。
更好的是,尽管我自己创建了多个示例并制定了解决方案,以便可以检查结果,但是有人知道(很好)解决了Lambda微积分减少问题的方法吗?我可以自己输入表达式,因此拥有多种更简单(更大)的lambda演算表达式来测试我的解释器(目前可以建模正常顺序和按名称调用评估策略)更为重要。
任何帮助或指导将不胜感激。
我在C中使用正则表达式(使用"regex.h"库).在为regcomp(...)和regexec(...)设置标准调用(和检查)之后,我只能设法打印与我编译的正则表达式匹配的实际子字符串.根据手册页,使用regexec意味着将子串匹配存储在称为"regmatch_t"的结构中.结构只包含rm_so和rm_eo来引用我所理解的内存中匹配子字符串的字符地址,但我的问题是我如何才能将这些用于偏移和两个指针来提取实际的子字符串并将其存储到一个数组(理想情况下是一个2D字符串数组)?
它只在您打印到标准输出时有效,但每当您尝试使用相同的设置但将其存储在字符串/字符数组中时,它会存储最初用于匹配表达式的整个字符串.此外,打印声明中的"%.*s"是什么?我想这是一个正则表达式,可以正确地读取指向字符数组的指针.我只想将匹配的子串存储在一个集合中,这样我就可以在我的软件中的其他地方使用它们了.
背景:p和p2都指向设置为指向字符串开头的指针,然后在下面的代码中输入while循环:[编辑:"匹配"是一个2D数组,意味着最终存储子字符串匹配并被预先分配/初始化在主循环之前,你看到下面]
int ind = 0;
while(1){
regExErr1 = regexec(&r, p, 10, m, 0);
//printf("Did match regular expr, value %i\n", regExErr1);
if( regExErr1 != 0 ){
fprintf(stderr, "No more matches with the inherent regular expression!\n");
break;
}
printf("What was found was: ");
int i = 0;
while(1){
if(m[i].rm_so == -1){
break;
}
int start = m[i].rm_so + (p - p2);
int finish = m[i].rm_eo + (p - p2);
strcpy(matches[ind], ("%.*s\n", (finish - start), p2 + start));
printf("Storing: %.*s", matches[ind]); …Run Code Online (Sandbox Code Playgroud) 我有一个MatLab脚本,我想在我的Javascript算法中使用.有没有办法让JavaScript调用MatLab脚本?更好的是,有没有办法松散地耦合MatLab脚本和Javascript页面?
我发现这一页讨论了使用.NET服务器来保存MatLab脚本/代码(http://www.mathworks.com/matlabcentral/answers/9521),但有没有其他更简单的方法来实现这一点?
我宁愿不用JavaScript重新编写MatLab代码.理想情况下,我想使用我的JavaScript,因为它目前可以直接将指定格式的字符串吐出到MatLab脚本中,并在该算法完成后访问其字符串输出.
我有什么方法可以做到这一点?如果只有.NET或类似的方法,有没有人有足够的资源来指导如何做到这一点,甚至更好,个人经验如何设置?
先感谢您.
重访注释(2013年12月17日)和决策: 事实证明,最终我将MatLab脚本重新编码为JavaScript变得更容易.谷歌闭包不久前发布了JavaScript,它为JavaScript语言提供了一些优秀的扩展功能,我强烈推荐给任何有兴趣使用它的人.我特别使用了它的Matrix库,它允许我在JavaScript中重新编码和设计我的Nodal Voltage Analysis方法.请查看:https: //developers.google.com/closure/
我一直在试图弄清楚如何调整OCaml 中已初始化数组的大小。然而,似乎虽然您可以编写一个函数来创建一个全新的数组,并复制旧数组的元素(以及额外的槽),但该函数的输出不能分配给现有数组。一个人会怎样做呢?如果没有的话,是否有一种简单的方法可以使用引用来实现这一点?
这是一个小例子:
让rec function_that_adds_to_array存储参数...=
(* 假设该函数有一组 if-else 结构来控制它的功能,并进一步说其中一个情况会导致:*)
let new_array = Array.make(Array.length storage)("Null",("Null",-2))中
Array.blit集合0 new_array 0索引;(*索引由函数的递归控制*)
Array.set new_array 索引(obj_name, obj_expr);
new_array) (* 在尾部插入宏 *)
...
;;
### 主要方法###
let storage = Array.make 10 ((x : string), (a, b)) in
...
虽然是真的
...
存储 = function_that_adds_to_array 存储参数....;
...
function_that_adds_to_array(...) 末尾的打印语句确认返回了一个新数组,其中包含初始数组的旧元素,但是,在 main 方法中,存储保持不变。这是因为 OCaml 元素的不变性吗?我认为数组是可变的。我环顾四周,有人提到编写 hack 来让 OCaml 表现得像 Perl,然而,使用一个人的调整大小 hack 函数被证明是徒劳的。有什么办法可以让存储成为一个新的阵列吗?它需要是一个可更新的元组集合(即 (string, (x, y)) )?
interface ×2
ocaml ×2
regex ×2
arrays ×1
c ×1
char ×1
expression ×1
immutability ×1
integration ×1
javascript ×1
matlab ×1
posix-ere ×1
resizable ×1
resize ×1
testing ×1