Function Editing

From NARS2000
Jump to navigationJump to search
  • To invoke the function editor, use one of the following methods:
    • type by itself, or
    • type followed by a name, or
    • type )EDIT by itself, or
    • type )EDIT followed by a name, or
    • double-right-click on a function name in the session manager or function editor windows. The button to double-click may be changed from the menu "Edit | Customize..." then selecting "User Preferences" and then "Reverse double-click"
  • The function editor supports a multilevel Undo. That is, pressing Ctrl-Z reverts back to the previous text.
  • Each function's undo buffer is saved with the function for reuse the next time that function is edited.
  • All function's undo buffers are saved with the workspace for reuse on the next load.
  • In the function header, except for the semicolon that separates the header template from the first local name, any semicolon may be replaced by one or more spaces.
  • While editing a function, several keystrokes are available:
    • To Save a function, press Ctrl-S
    • To Save & Exit a function, press Ctrl-E
    • To Quit without saving the function, press Ctrl-Q
    • To create a new physical and logical line, press Enter; if the cursor is in the middle of a line, it breaks the line in two at that point
    • To create a new physical but not logical line, press Shift-Enter; if the cursor is in the middle of a line, it continues the line onto the next physical line at that point. The continued line is identified by a Line Continuation marker (by default, '' — U+27A5) at the start of the line.
    • Multiple adjacent continued lines form a block which is treated as a single logical line.
    • The default Line Continuation marker may be changed by going to "Edit | Customize..." then selecting "User Preferences" and then "Line Continuation".
    • If line numbering is enabled for this particular function, only logical lines are numbered. That is, for a logical line continued onto the next physical line, only the starting physical line is numbered — the remaining physical lines in the block of continued lines are unnumbered.

For example,

[0]      Z←L f R
[1]      Z←
       L ⍝ Left arg
       + ⍝ Function
       R ⍝ Right arg

Another use for Line Continuations is in function headers with a large number of local variables. The following example is taken from the ANALYZE function in the 2by2 workspace:

[0]      gTRACE←{bBstrNums} ANALYZE STRING;TCNL;TCNUL;LSTACK;RSTACK;CUROBJ;REDUCTIONS;OBJ;EVENT;UNK;DOP;DOPN;MOP;MOPN;IDX;F;MF;NF;A;SA;J;EOS;LP;RP;LBK;SEMI;RBK;ARBK;SRBK;LBC;RBC;SP;BSTR;SYNOBJ;RES;FFR;FR;AFR;HFR;GO;NAM;SPA;SPD;SPF;SPM;SPHY;SPNF;CS0;CS1;CSF;CSI;CSIA;CSIV;HY;MR;DR;HR;SPFR;SPMR;SPDR;SPHR;SPMN;SPDN;JD;SOS;LASTRIGHT;AFOG;AFOR;CSEF;CSFN;IO;ISPA;LNR;NNR;NR;SYNR;SYSN;VALR;NVAL;LftStkLen;RhtStkLen;⎕IO
[1] ...

which can be rewritten using Line Continuations as several short lines

[0]      gTRACE←{bBstrNums} ANALYZE STRING;
TCNL TCNUL LSTACK RSTACK CUROBJ REDUCTIONS
OBJ EVENT UNK DOP DOPN MOP MOPN IDX F MF NF A SA J EOS LP RP
LBK SEMI RBK ARBK SRBK LBC RBC SP BSTR SYNOBJ RES FFR FR AFR
HFR GO NAM SPA SPD SPF SPM SPHY SPNF CS0 CS1 CSF CSI CSIA CSIV
HY MR DR HR SPFR SPMR SPDR SPHR SPMN SPDN JD SOS LASTRIGHT AFOG
AFOR CSEF CSFN IO ISPA LNR NNR NR SYNR SYSN VALR NVAL LftStkLen RhtStkLen ⎕IO
[1] ...

which can then be further organized into groups of related local variables along with a trailing comment on each line, as opposed to the typical practice of the function header as a disorganized unordered pile into which names are tossed.

[0]      gTRACE←{bBstrNums} ANALYZE STRING;
⎕IO BSTR CUROBJ EVENT LASTRIGHT OBJ REDUCTIONS RES SYNOBJ TCNL TCNUL ⍝ Local vars
LftStkLen RhtStkLen LSTACK RSTACK                          ⍝ Stack vars
A AFOG AFOR AFR ARBK CS0 CS1 CSEF CSF CSFN CSI CSIA CSIV  ⍝ Syntax objects
DOP DOPN DR EOS F FFR FR GO HFR HR HY IDX IO ISPA J JD    ⍝ Syntax objects
LBC LBK LNR LP MF MOP MOPN MR NAM NF NNR NR NVAL          ⍝ Syntax objects
RBC RBK RP SA SEMI SOS SP SPA SPD SPDN SPDR SPF SPFR SPHR ⍝ Syntax objects
SPHY SPM SPMN SPMR SPNF SRBK SYNR SYSN UNK VALR           ⍝ Syntax objects
[1] ...

Editing An Anonymous Function/Operator (AFO)

If the function being edited is an AFO, then Shift-Enter may be used (as above) to create additional physical but not logical lines, and Enter may be used to create additional both physical and logical lines.

For example,

      h←{s←(+/⍵)÷2 ⋄ √×/s-0,⍵}

and then editing this function via ∇h or )EDIT h or double-clicking the name h displays a function editor window containing

[0]      h
[1]      s←(+/⍵)÷2 ⋄ √×/s-0,⍵

This function may be edited further by deleting the diamond separator and pressing Enter at that point so as to split the line in two, resulting in

[0]      h
[1]      s←(+/⍵)÷2
[2]      √×/s-0,⍵ ⍝ Heron's formula for triangle area

The Enter key is used to create a multi-physical-line AFO, whereas Shift-Enter creates a multi-logical-line AFO. The two types may appear together in a single AFO.

Note that when editing an AFO in this way, the function header line may not be changed.

Moreover, this method of editing an AFO also allows you to define additional entry points such as for an identity, prototype, or multiset function via the System Labels ⎕ID, ⎕PRO, ⎕MS, respectively. When system labels are used, they must appear at the start of a logical line.

For example, the above function h could be edited to include an identity function entry point as follows:

[0]      h
[1]      s←(+/⍵)÷2
[2]      √×/s-0,⍵ ⍝ Heron's formula for triangle area
[3]      ⎕ID:0

which allows the function to be used where an identity function is required such as

      h/⍬
0