我想学习APL(更具体地说是Dyalog APL),但我似乎找不到任何好的资料来学习.
我能找到的唯一来源是Dyalog的文档下载,但除此之外,任何人都可以推荐一个好的来源吗?
几年前我在主机上偷看了APL2,并记得为向矩阵添加矢量的问题展示了解决方案.
鉴于a?4 4 ? ?16和?io?1
向行添加向量的旧方法就像
a+(?a)?10 20 30 40
Run Code Online (Sandbox Code Playgroud)
导致
11 22 33 44
15 26 37 48
19 30 41 52
23 34 45 56
Run Code Online (Sandbox Code Playgroud)
并将向量添加到矩阵的列中
a+(4 1?10 20 30 40)[;1 1 1 1]
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意,
a+4/4 1?10 20 30 40
Run Code Online (Sandbox Code Playgroud)
导致
11 12 13 14
25 26 27 28
39 40 41 42
53 54 55 56
Run Code Online (Sandbox Code Playgroud)
幸运的是,我能够打电话给那天给我看APL2的那个人(他已经退休但仍然接听了他的电话)并询问了第二个解决方案,他立即记得我在说什么.
新的APL2方式更加简洁,简洁,一致,这些例子可以通过a+[2] 10 20 30 40和解决a+[1] 10 20 30 40.凉.它在Dyalog工作.
快进十年或更长时间,我看到有一个名为The Rank Operator的新东西.第一个例子可以通过解决a(+?1) …
\n我目前正在为一个类开发 APL 程序,并且遇到了错误处理问题。
\n\n在我制作的函数中,我想检查输入是否是整数。如果不是,我想返回错误消息并且不运行函数的其余部分。到目前为止,我比较它是否等于它本身的下限。如果没有,我不希望该函数运行并希望它停止。如果我输入并给出错误消息,它会起作用,但如果我输入类似or 的内容并仅给出正常错误,则它4.2不起作用。我尝试制作一个 try catch 语句,但是当它进入我的函数时它给了我一个错误。\'A\'\'ABCDEF\':Try
这不是我想要的。如果输入是字符或字符串,如何使函数以错误消息结束而不是继续?我知道我可以将整个代码放在 if 块中,但这似乎确实没有必要。
\n\n我的纯文本代码:
\n\n TESTER Q;error\n :If Q\xe2\x89\xa2\xe2\x8c\x8aQ\n \'Possible\'\n :Else\n \'Not Possible\'\n :EndIf\n \'Again, Possible\'\nRun Code Online (Sandbox Code Playgroud)\n\n作为屏幕截图:
\n\n
我正在阅读 Hui 和 Kromberg 最近的“自 1978 年以来的 APL”,在?(模板)的讨论中,他们给出了以下示例:
{??}?5?'abcde'
abc abcd abcde bcde cde
Run Code Online (Sandbox Code Playgroud)
为什么{??}需要的只是??我对 APL 还是很陌生,但我天真地认为,一般来说{f?}应该等同于fmonadically 调用。
根据经验,我可以看到情况并非如此:
??5?'abcde'
DOMAIN ERROR
??5?'abcde'
?
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么。
我一直在尝试APL。我运行的是 Windows 10,并且已安装 Dyalog 18.0 以及 VS Code 的 APL 语言和 APL 反引号符号扩展。
\n但即使我没有运行任何这些程序,有时我的键盘会突然被劫持!我的所有 ctrl 命令都被 APL 符号替换。\n例如 ctrl-Z(撤消)变为 \xe2\x8a\x82,ctrl-A(全选)变为 \xe2\x8d\xba。我不知道为什么以及如何再次禁用它。这让我的工作变得非常困难!
\n我一直在谷歌搜索这个问题,但到目前为止还没有找到答案。我查看了 Windows 键盘设置,但看起来很正常。区域设置也正确。\n我现在只是卸载所有内容,但这样我每次想尝试 APL 时都需要重新安装。
\n有人可以告诉我发生了什么事以及如何解决它吗?(并告诉我该向谁抱怨这是一个非常敌对的功能)
\n#!/usr/bin/dyalog -script\n\xe2\x8d\x9d /usr/bin/dyalog is a symlink to /opt/mdyalog/18.0/64/unicode/mapl\n\nfactors\xe2\x86\x90{\xe2\x8e\x95ML \xe2\x8e\x95IO\xe2\x86\x901 \xe2\x8b\x84 \xe2\x8d\xb5{ \xe2\x8d\xb5,(\xe2\x8d\xba\xc3\xb7\xc3\x97/\xe2\x8d\xb5)~1}\xe2\x88\x8a\xe2\x8d\xb5{(0=(\xe2\x8d\xb5*\xe2\x8d\xb3\xe2\x8c\x8a\xe2\x8d\xb5\xe2\x8d\x9f\xe2\x8d\xba)|\xe2\x8d\xba)/\xe2\x8d\xb5}\xc2\xa8\xe2\x8d\xac{nxt\xe2\x86\x90\xe2\x8a\x83\xe2\x8d\xb5 \xe2\x8b\x84 msk\xe2\x86\x900\xe2\x89\xa0nxt|\xe2\x8d\xb5 \xe2\x8b\x84 \xe2\x88\xa7/1\xe2\x86\x93msk:\xe2\x8d\xba,\xe2\x8d\xb5 \xe2\x8b\x84 (\xe2\x8d\xba,nxt)\xe2\x88\x87 msk/\xe2\x8d\xb5}\xe2\x8d\xb5{ (0=\xe2\x8d\xb5|\xe2\x8d\xba)/\xe2\x8d\xb5}2,(1+2\xc3\x97\xe2\x8d\xb3\xe2\x8c\x8a0.5\xc3\x97\xe2\x8d\xb5*\xc3\xb72),\xe2\x8d\xb5}\nfactors 20\nRun Code Online (Sandbox Code Playgroud)\n从https://dfns.dyalog.com/c_factors.htm复制\n它的工作原理与示例完全相同,除了我无法将其作为单独的行输入并且必须求助于\xe2\x8b\x84\'s
使用该示例会导致
\n./.local/src/sandbox/apl/Main.apl \nSYNTAX ERROR\n factors\xe2\x86\x90{\xe2\x8e\x95ML \xe2\x8e\x95IO\xe2\x86\x901 \xe2\x8d\x9d Prime factors of \xe2\x8d\xb5.\nRun Code Online (Sandbox Code Playgroud)\n另一个问题是使用像或 这样]的命令\n使用它们总是会导致]display]box on
./.local/src/sandbox/apl/Main.apl \n\nVALUE ERROR: Undefined name: \xe2\x8e\x95SE.UCMD\nRun Code Online (Sandbox Code Playgroud)\n 我想定义一个带有单个参数的匿名函数向量,然后在该向量上映射一个参数,返回每个索引x的结果数组。f(x)这在 Dyalog 中可能吗?
我问这个问题是因为我天真的尝试创建这样一个闭合向量:
\n\nfs \xe2\x86\x90 {\xe2\x8d\xb5\xc3\x972} {\xe2\x8d\xb5\xc3\x974} {\xe2\x8d\xb5\xc3\x978}\nRun Code Online (Sandbox Code Playgroud)\n\n行为奇怪。尝试引用fs看似引用所有索引的单个索引并导致输出混乱:
fs[1]\n \xe2\x88\x87{\xe2\x8d\xb5\xc3\x972}\n \xe2\x88\x87 \xe2\x88\x87{\xe2\x8d\xb5\xc3\x974}\n \xe2\x88\x87 \xe2\x88\x87{\xe2\x8d\xb5\xc3\x978}\n \xe2\x88\x87 [ 1\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x8d\xb4fs返回类似的输出而不是 3,让我相信我根本没有创建数组。解决这个问题的正确方法是什么?
我试图理解 APL 中的经典快速排序:
\n\nQ\xe2\x86\x90{1\xe2\x89\xa5\xe2\x89\xa2\xe2\x8d\xb5:\xe2\x8d\xb5 \xe2\x8b\x84 S\xe2\x86\x90{\xe2\x8d\xba\xe2\x8c\xbf\xe2\x8d\xa8\xe2\x8d\xba \xe2\x8d\xba\xe2\x8d\xba \xe2\x8d\xb5} \xe2\x8b\x84 \xe2\x8d\xb5((\xe2\x88\x87<S)\xe2\x8d\xaa=S\xe2\x8d\xaa(\xe2\x88\x87>S))\xe2\x8d\xb5\xe2\x8c\xb7\xe2\x8d\xa8?\xe2\x89\xa2\xe2\x8d\xb5}\nRun Code Online (Sandbox Code Playgroud)\n\n有些事情我不明白,有些风格选择困扰我,所以我要把它们全部列出来。我希望有人可以向我解释它们。
\n\n{ }defn 中,\xe2\x8d\xba是左参数,\xe2\x8d\xb5是右参数。\xe2\x8d\xba\xe2\x8d\xba里面是什么 S\xe2\x86\x90{\xe2\x8d\xba\xe2\x8c\xbf\xe2\x8d\xa8\xe2\x8d\xba \xe2\x8d\xba\xe2\x8d\xba \xe2\x8d\xb5}?同样,有一个\xe2\x8d\xb5\xe2\x8d\xb5? \xe2\x8d\xba里面的是S指 的左参数S还是 的左参数Q? 我的猜测是,\xe2\x8d\xba里面的S指的是 的左边参数S。the\xe2\x8d\xba\xe2\x8d\xba指的是封闭函数\xe2\x8d\xba的 的(即Q 的 )。\xe2\x8d\xba
\xe2\x8d\xa8)?代码写成这样是不是更清晰了:Q\xe2\x86\x90{1\xe2\x89\xa5\xe2\x89\xa2\xe2\x8d\xb5:\xe2\x8d\xb5 \xe2\x8b\x84 S\xe2\x86\x90{(\xe2\x8d\xba \xe2\x8d\xba\xe2\x8d\xba \xe2\x8d\xb5)\xe2\x8c\xbf\xe2\x8d\xba} \xe2\x8b\x84 \xe2\x8d\xb5((\xe2\x88\x87<S)\xe2\x8d\xaa=S\xe2\x8d\xaa(\xe2\x88\x87>S))\xe2\x8d\xb5[?\xe2\x89\xa2\xe2\x8d\xb5]}\nRun Code Online (Sandbox Code Playgroud)\n\n我能想到的使用 commute …
我现在知道如何使用 APL 解释器,但我对如何将 APL 写入文件然后运行该文件感到非常困惑。我目前使用RIDE编写 Dyalog APL 。我现在想做的是:
大多数在线文档都提到“APL 会话”,这让我觉得可能存在一些类似 Smalltalk 的东西,人们只能分发“实时图像”或类似的东西。如果是这样的话,我有一组不同的问题:
总的来说,我对如何用APL编写软件感到很困惑!
我使用的是 Ubuntu,一般来说我想以 Linux 为目标。Windows/macOS 支持将是一个优势,但我目前对 Linux 支持感兴趣。
executable software-distribution apl dyalog command-line-arguments
APL 中函数向量(数组)的语法是什么?
我尝试过以下操作,但它们分别被解释为 3 列和 2 列:
{1},{2}
Run Code Online (Sandbox Code Playgroud)
{1} {2}
Run Code Online (Sandbox Code Playgroud)
附言。顺便说一句,我希望用更复杂(并且可能命名)的函数来做到这一点,上面的{1}例子很简短。