我最近开始学习J。
如果发现在学习新语言时能够快速实用的话,
将一些源代码映射到输出,并将其存储以供以后在Emacs组织模式下参考。
但是当我想进行评估时,我在使用神秘的jconsole
时遇到了麻烦。
例如jconsole --help
不起作用。man jconsole
提出了有关Java工具的一些知识。同样适用于谷歌搜索。
例如,我将本教程中的这段代码保存在temp.ijs
中:
m =. i. 3 4
1 { m
23 23 23 23 (1}) m
现在,当我运行
jconsole < temp.ijs
时,输出为: 4 5 6 7
0 1 2 3
23 23 23 23
8 9 10 11
理想情况下,我希望输出为:
4 5 6 7
0 1 2 3
23 23 23 23
8 9 10 11
同样,理想情况下,我希望完全不更改源代码,
即只是通过将一些标志传递给
jconsole
。有没有办法做到这一点?
最佳答案
我目前正在从Emacs方面而不是jconsole方面解决问题。
我将源代码插入echo''
:
(defun org-babel-expand-body:J (body params)
"Expand BODY according to PARAMS, return the expanded body."
(mapconcat #'identity (split-string body "\n") "\necho''\n"))
像这样执行:
(j-strip-whitespace
(org-babel-eval
(format "jconsole < %s" tmp-script-file) ""))
然后进行后处理,假设每个数组的仅第一行未对齐
(到目前为止,这是我的经验)。结果如下:
#+begin_src J
m =. i. 3 4
1 { m
23 23 23 23 (1}) m
#+end_src
#+RESULTS:
: 4 5 6 7
:
: 0 1 2 3
: 23 23 23 23
: 8 9 10 11
这是后处理代码:
(defun whitespacep (str)
(string-match "^ *$" str))
(defun match-second-space (s)
(and (string-match "^ *[^ ]+\\( \\)" s)
(match-beginning 1)))
(defun strip-leading-ws (s)
(and (string-match "^ *\\([^ ].*\\)" s)
(match-string 1 s)))
(defun j-print-block (x)
(if (= 1 (length x))
(strip-leading-ws (car x))
;; assume only first row misaligned
(let ((n1 (match-second-space (car x)))
(n2 (match-second-space (cadr x))))
(setcar
x
(if (and n1 n2)
(substring (car x) (- n1 n2))
(strip-leading-ws (car x))))
(mapconcat #'identity x "\n"))))
(defun j-strip-whitespace (str)
(let ((strs (split-string str "\n" t))
out cur s)
(while (setq s (pop strs))
(if (whitespacep s)
(progn (push (nreverse cur) out)
(setq cur))
(push s cur)))
(mapconcat #'j-print-block
(delq nil (nreverse out))
"\n\n")))