Function Editing: Difference between revisions

From NARS2000
Jump to navigationJump to search
No edit summary
(2 intermediate revisions by the same user not shown)
Line 4: Line 4:
** type <apll>)EDIT</apll> by itself, or
** type <apll>)EDIT</apll> by itself, or
** type <apll>)EDIT</apll> followed by a name, or
** type <apll>)EDIT</apll> followed by a name, or
** double-right-click on a function name in the session manager or function editor windows.
** 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.
* 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.
* 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.
* 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:
* While editing a function, several keystrokes are available:
** To Save a function, press '''Ctrl-S'''
** To Save a function, press '''Ctrl-S'''
Line 20: Line 21:
<p>For example,</p>
<p>For example,</p>


<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;Z←L f R;<br />
<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;Z←L f R<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>a b c d e ⍝ Locals<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>f g h i j<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>k l m n o ⍝ More locals<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>p q r s t<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>u v w x y z<br />
[1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;Z←<br />
[1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;Z←<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>L ⍝ Left arg<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue;">➥</span>L ⍝ Left arg<br />
Line 32: Line 28:
</apll>
</apll>


<p>This example also shows the ability to split a long function header line into several more manageable lines with comments on any of the continued lines.</p>
<p>Another use for Line Continuations is in function headers with a large number of local variables.  The following example is taken from the <apll>ANALYZE</apll> function in the <apll>2by2</apll> workspace:</p>


<p>If the function being edited is an Anonymous Function/Operator (AFO), then the '''Enter''' key may be used to create additional logical lines in the AFO.</p>
<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;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<br />
[1] ...<br />
</apll>
 
<p>which can be rewritten using Line Continuations as several short lines</p>
 
<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;gTRACE←{bBstrNums} ANALYZE STRING;<br />
<span style="color:blue;">➥</span>TCNL TCNUL LSTACK RSTACK CUROBJ REDUCTIONS<br />
<span style="color:blue;">➥</span>OBJ EVENT UNK DOP DOPN MOP MOPN IDX F MF NF A SA J EOS LP RP<br />
<span style="color:blue;">➥</span>LBK SEMI RBK ARBK SRBK LBC RBC SP BSTR SYNOBJ RES FFR FR AFR<br />
<span style="color:blue;">➥</span>HFR GO NAM SPA SPD SPF SPM SPHY SPNF CS0 CS1 CSF CSI CSIA CSIV<br />
<span style="color:blue;">➥</span>HY MR DR HR SPFR SPMR SPDR SPHR SPMN SPDN JD SOS LASTRIGHT AFOG<br />
<span style="color:blue;">➥</span>AFOR CSEF CSFN IO ISPA LNR NNR NR SYNR SYSN VALR NVAL LftStkLen RhtStkLen ⎕IO<br />
[1] ...<br />
</apll>
 
<p>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.</p>
 
<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;gTRACE←{bBstrNums} ANALYZE STRING;<br />
<span style="color:blue;">➥</span>⎕IO BSTR CUROBJ EVENT LASTRIGHT OBJ REDUCTIONS RES SYNOBJ TCNL TCNUL ⍝ Local vars<br />
<span style="color:blue;">➥</span>LftStkLen RhtStkLen LSTACK RSTACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp; ⍝ Stack vars<br />
<span style="color:blue;">➥</span>A AFOG AFOR AFR ARBK CS0 CS1 CSEF CSF CSFN CSI CSIA CSIV&nbsp;&nbsp;⍝ Syntax objects<br />
<span style="color:blue;">➥</span>DOP DOPN DR EOS F FFR FR GO HFR HR HY IDX IO ISPA J JD&nbsp;&nbsp;&nbsp;&nbsp;⍝ Syntax objects<br />
<span style="color:blue;">➥</span>LBC LBK LNR LP MF MOP MOPN MR NAM NF NNR NR NVAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;⍝ Syntax objects<br />
<span style="color:blue;">➥</span>RBC RBK RP SA SEMI SOS SP SPA SPD SPDN SPDR SPF SPFR SPHR&nbsp;⍝ Syntax objects<br />
<span style="color:blue;">➥</span>SPHY SPM SPMN SPMR SPNF SRBK SYNR SYSN UNK VALR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;⍝ Syntax objects<br />
[1] ...<br />
</apll>
 
==Editing An Anonymous Function/Operator (AFO)==
 
<p>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.</p>


<p>For example,</p>
<p>For example,</p>
Line 40: Line 67:
<apll>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h←{s←(+/⍵)÷2 ⋄ √×/s-0,⍵}</apll>
<apll>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h←{s←(+/⍵)÷2 ⋄ √×/s-0,⍵}</apll>


<p>Then editing this function via <apll>∇h</apll> displays a function editor window containing</p>
<p>and then editing this function via <apll>∇h</apll> or <apll>)EDIT h</apll> or double-clicking the name <apll>h</apll> displays a function editor window containing</p>


<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;h<br />
<apll>[0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;h<br />
Line 52: Line 79:
[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;√×/s-0,⍵ ⍝ Heron's formula for triangle area<br />
[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ensp;√×/s-0,⍵ ⍝ Heron's formula for triangle area<br />
</apll>
</apll>
<p>The '''Enter''' key is used to create a '''multi-line''' AFO, whereas '''Shift-Enter''' creates a '''multi-statement''' AFO.  The two types may appear together in a single AFO which is both '''multi-statement''' and '''multi-line'''.</p>


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


<p>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 <apll>⎕ID</apll>, <apll>⎕PRO</apll>, <apll>⎕MS</apll>, respectively.</p>
<p>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''' <apll>⎕ID</apll>, <apll>⎕PRO</apll>, <apll>⎕MS</apll>, respectively.  When system labels are used, they must appear at the start of a logical line.</p>


<p>For example, the above function <apll>h</apll> could be edited to include an identity function entry point as follows:</p>
<p>For example, the above function <apll>h</apll> could be edited to include an identity function entry point as follows:</p>

Revision as of 19:57, 7 January 2017

  • 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-line AFO, whereas Shift-Enter creates a multi-statement AFO. The two types may appear together in a single AFO which is both multi-statement and multi-line.

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