Perigord
Perigord

Reputation: 111

Issue with declaring multiline functions in APL

#!/usr/bin/dyalog -script
⍝ /usr/bin/dyalog is a symlink to /opt/mdyalog/18.0/64/unicode/mapl

factors←{⎕ML ⎕IO←1 ⋄  ⍵{ ⍵,(⍺÷×/⍵)~1}∊⍵{(0=(⍵*⍳⌊⍵⍟⍺)|⍺)/⍵}¨⍬{nxt←⊃⍵ ⋄ msk←0≠nxt|⍵ ⋄ ∧/1↓msk:⍺,⍵ ⋄ (⍺,nxt)∇ msk/⍵}⍵{ (0=⍵|⍺)/⍵}2,(1+2×⍳⌊0.5×⍵*÷2),⍵}
factors 20

Copied from https://dfns.dyalog.com/c_factors.htm It works exactly as the example apart from the fact I am not able to to type it as separate lines and have to resort to 's

Using the example it instead results in

./.local/src/sandbox/apl/Main.apl                                                                                                                                                                                                     
SYNTAX ERROR
 factors←{⎕ML ⎕IO←1          ⍝ Prime factors of ⍵.

Another issue is using ] commands like ]display or ]box on Using them always results in

./.local/src/sandbox/apl/Main.apl                                                                                                                                                                                                     

VALUE ERROR: Undefined name: ⎕SE.UCMD

Upvotes: 6

Views: 263

Answers (1)

Adám
Adám

Reputation: 7616

Try* adding setting DYALOG_LINEEDITOR_MODE to 1:

#!/usr/bin/dyalog -script DYALOG_LINEEDITOR_MODE=1

When running in script mode, SALT, and therefore user commands, are not initialised automatically. As per APLcart, you can enable both with:

(⎕NS⍬).(_←enableSALT⊣⎕CY'salt')

However, under program control, you're usually better off using proper functions than user commands. You can copy in the display and disp functions (which take an array and produce character matrices equivalent to what you'd see from ]display and ]box on) with:

'display' 'disp'⎕CY'dfns'

* Both -script and DYALOG_LINEEDITOR_MODE are experimental in version 18.0, while 18.2 (scheduled for release in March 2022) has dedicated #! script support.

Upvotes: 5

Related Questions