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