我最近开始学习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")))

10-08 09:42