调用jconsole时如何获得一个好的输出?

时间:2013-12-03 10:10:11

标签: j

我最近开始学习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。 有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

我目前正在解决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"))) 

答案 1 :(得分:2)

您需要使用echo进行显式输出,而不是依靠隐式输出,这通常是jconsole的REPL函数的情况。

创建脚本,下面将其称为“ tst2.js”,并将以下代码放入其中:

#!/Applications/j64/bin/jconsole
9!:7'+++++++++|-'
m =. i. 3 4
echo 1 { m
echo ''
echo 23 23 23 23 (1}) m
exit''

当然,如果您到jconsole的路径不同,则将“ shebang”行更新为系统的实际路径。

接下来,确保脚本是可执行的:

$ chmod +x tst2.js

或您所谓的脚本。

接下来,调用它:

$ ./tst2.js
4 5 6 7

 0  1  2  3
23 23 23 23
 8  9 10 11

请注意,以上输出与您在交互式jconsole中使用时生成的输出相同。

答案 2 :(得分:1)

问题在于松散的声明。每次给控制台一个命令时,它都会回复答案。您应该使用动词格式化代码,并将其echo置于您需要的位置。

foo =: 3 : 0
    m =. i. 3 4
    echo ''
    echo 1 { m
    echo ''
    echo 23 23 23 23 (1}) m
    ''
)
foo''

如果你赶时间,它也可以是无名的和自我执行的:

3 : 0 ''
    m =. i. 3 4
    echo ''
    echo 1 { m
    echo ''
    echo 23 23 23 23 (1}) m
    ''
)