标准输入的重定向似乎改变了 Dyalog APL 程序的行为(当使用符号 link 命名的 dyalog 调用 mapl 时)

Redirection of standard input seems to change behaviour of Dyalog APL program (when calling mapl using symbolic link named dyalog)

我正在尝试学习 APL(一般的 APL 和 Dyalog APL,它似乎正在积极开发中并在斯德哥尔摩这里使用)。

这样做时,我观察到,在我的 Ubuntu Linux 环境中,dyalog(实际上是一个名为 mapl 的文件,它是通过一个名为 link 的符号 [= =27=]) 当 stdin 与管道或打开的磁盘文件而不是终端驱动程序相关联时,似乎表现不同。

当我将终端驱动程序替换为管道作为标准输入时,解释器似乎不再理解 ]DISPLAY。

此处的 ]DISPLAY command/function 似乎有效 :

Command: dyalog without arguments or stdin redirection :

Dyalog APL/S-64 Version 16.0.30320
Unicode Edition
Mon Aug 14 19:27:14 2017
      ]DISPLAY 42

42

在这里,解释器似乎对 ]DISPLAY 感到困惑:

root@lenovo201707:/home/u/20170814# ( echo "]DISPLAY 42" ; echo ")off" ) |         dyalog
Dyalog APL/S-64 Version 16.0.30320 Unicode
For i86_64
Created: Jul  7 2017 at 02:48:48
Copyright (c) Dyalog Limited 1982-2017
      ]DISPLAY 42

VALUE ERROR
root@lenovo201707:/home/u/20170814# 

从现有的 UTF-8 编码文件加载和执行我的 APL 代码时,有没有一种简单的方法不会丢失 ]DISPLAY 函数?

此致! 汉斯·戴维森

更新的答案: 以下应该可以解决您的请求:

( echo "]DISPLAY 42" ; echo ")off" ) |  /opt/mdyalog/16.0/64/unicode/mapl salt  

唯一发生变化的细节是我们现在在尝试执行 UCMD 之前加载 salt-workspace。 SALT 将(通过其 ⎕LX)设置环境,以便它可以处理 UCMD。

我的初始回复: 我是一名 Windows 用户,必须承认我从未使用过 Linux 管道,所以我无法帮助解决一般机制。

但是我对具体问题有一个答案。 ]DISPLAY:您可以使用 ⎕se.UCMD'{ucmd & args}' 在程序控制下调用任何 UCMD,例如:⎕se.UCMD'DISPLAY ⍳3 3'

顺便说一句,我个人称之为 ⎕se.Dyalog.Utils.disp MyVar,它避免了 UCMD 机制,并且在从 fn 调用时更容易使用。

注意:单击下面的任意代码行可在在线试用 网站上试用。该服务将其 Input 文本字段(链接将使用适当的代码填充)的内容通过管道传输到 Linux APL,因此与您的环境完全相似。


当 运行 编写脚本(例如接收管道输入)时,Dyalog APL 不会填充 ⎕SE。如果你只想要显示功能,你可以从 dfns:

复制等效的实用程序

'display'⎕CY'dfns'

但是,这仍然会强制您使用完整的命名空间路径从 # 以外的其他命名空间调用 display。要实际使用用户命令,您必须手动启用 SALT:

⎕CY'salt' ⋄ enableSALT

为避免使您的工作区和会话混乱,您可以使用此 dfn:

{s←⎕NS ⍬ ⋄ 6::_←s.enableSALT ⋄ ⊢s.⎕CY'salt'}⍬