原始函数列车的 Dyalog SALT.Load 异常“无法修复”

问题描述

我一直在试验 SALT,但遇到了似乎只影响原始函数训练的一致 Load 问题。我希望得到任何关于确保所有函数 Load 正确的建议。

为了说明,在一个清晰的工作区中,我将创建一些用于转换十六进制和八进制的示例函数。有些是 dfns,有些是原始火车:

FromOct←8⊥⊢
ToOct←(FromOct⍣¯1)
FromHex←{16⊥⍵}
ToHex←{((16⊥⊢)⍣¯1)⍵}
HexToOct←ToOct FromHex

初始盐状态:
⎕SE.SALT.List '/path/to/salt'
Type Name Versions Size Last Update

然后Snap工作区:
⎕SE.SALT.Snap '/path/to/salt -clean -loadfn'

** WARNING: ⎕LX is empty
 #.FromHex  #.FromOct  #.HexToOct  #.ToHex  #.ToOct 

⎕SE.SALT.List '/path/to/salt -type'

 Type  Name      Versions  Size  Last Update         
 Fn    FromHex               25  2021/05/18 17:08:32 
 Fn    FromOct               25  2021/05/18 17:08:32 
 Fn    HexToOct              46  2021/05/18 17:08:32 
 Fn    ToHex                 36  2021/05/18 17:08:32 
 Fn    ToOct                 31  2021/05/18 17:08:32 
 Fn    load_ws              537  2021/05/18 17:08:32 

并检查 load_ws 函数正在导入什么:
⎕CMD 'cat /path/to/salt/load_ws.dyalog | grep "^ Load''"'

 Load'"/path/to/salt/FromHex" -target=#'       â #.FromHex
 Load'"/path/to/salt/FromOct" -target=#'       â #.FromOct
 Load'"/path/to/salt/HexToOct" -target=#'      â #.HexToOct
 Load'"/path/to/salt/ToHex" -target=#'         â #.ToHex
 Load'"/path/to/salt/ToOct" -target=#'         â #.ToOct

在干净的工作区中,运行 load_ws:
⎕SE.SALT.Load '/path/to/salt/load_ws'
load_ws

*** Could not fix "/path/to/salt/FromOct.dyalog"
*** Could not fix "/path/to/salt/HexToOct.dyalog"
*** Could not fix "/path/to/salt/ToOct.dyalog"

dfns 加载正常,火车失败。
一个现成的解决方法是使用 Tradfns 或 dfns 进行包装,但这是非常不可取的。

有没有想过让 SALT 正确加载这些类型的函数
谢谢

解决方法

根据the current SALT User Guide

? Nameclasses 3.3(原始或派生函数)和 4.3(原始或派生运算符)不能使用 SALT 操作 - 尝试这样做可能会导致数据丢失。

Paul Mansour's comment中所述,Dyalog Ltd. 建议从 SALT 过渡到 Link,尤其是在使用 Dyalog APL 版本 18.1 时,该版本将于未来几个月发布。但是,请注意,即使是 Link does not currently handle tacit functions:

不支持没有文本源的函数、运算符和命名空间(3.3 或 4.3 的 ⎕NC,即派生函数/运算符、训练和命名原语)。

与 SALT 不同,SALT 没有计划添加任何主要功能,这可能会在不久的将来发生变化。

虽然手动将默认函数包装在 tradfns 中很尴尬,但 “Lazy” library 使这变得轻而易举。