【发布时间】:2018-03-20 00:32:25
【问题描述】:
我想创建一个运行 Common Lisp 程序的新进程,其参数来自我的 C# 程序。换句话说,我正在寻找这些程序之间的互操作性。现在我正在使用此代码在cmd 中打开clisp:
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine("clisp");
cmd.StandardInput.WriteLine("(load " + '"' + "CargarNodos.lisp" + '"' + ")");
cmd.StandardInput.WriteLine("(cargar-cds)");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());
我可以加载我的 .lisp 文件,但是当我调用函数“cargar-cds”时程序崩溃(如果我直接从 cmd 运行 lisp 函数,它工作正常)。 我认为 .lisp 崩溃的部分是这段代码:
(SETQ NODOS () )
(defun cargar-cds()
(SETQ L (OPEN "adyacencias.txt" :IF-DOES-NOT-EXIST NIL))
(WHEN L
(LOOP FOR LINEA = (READ-LINE L nil) WHILE LINEA DO
(setq lst (loop for i = 0 then (1+ j)
as j = (position #\tab LINEA :start i)
collect (subseq LINEA i j)
while j ))
(formato-plano lst)
(setq NODOS (append NODOS (list LISTAF))))
)
NODOS)
【问题讨论】:
-
您有任何错误信息吗?如果我将您的 Lisp 代码复制粘贴到我的编辑器中,则表明括号不平衡。你确定代码作为独立的 Lisp 脚本运行良好吗?
-
它运行良好,但我发布的代码缺少撇号:(SETQ NODOS '())。你知道如何在不注释其余代码的情况下编写它吗?
-
完整的代码相当大,它调用了另一个函数,但我认为主要问题在于发布的那个,可能是因为它读取了一个文本文件。
-
回答第一个问题,Visual Studio 没有显示错误,即使发布的 c# 代码在 try/catch 中,运行的应用程序也只会冻结。
-
Jorge:问题在于您的代码难以阅读和理解。它的格式不可读,并且充满了未定义的变量。谁知道它在做什么以及为什么以及何时会偶然起作用。
标签: c# visual-studio shell common-lisp