add pick op, increment version
This commit is contained in:
		
							parent
							
								
									ed6cf767d0
								
							
						
					
					
						commit
						9e4eac6f12
					
				
							
								
								
									
										44
									
								
								SPEC.html
								
								
								
								
							
							
						
						
									
										44
									
								
								SPEC.html
								
								
								
								
							| 
						 | 
					@ -15,41 +15,6 @@
 | 
				
			||||||
	display: none;
 | 
						display: none;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* From extension ms-toolsai.jupyter */
 | 
					 | 
				
			||||||
/* These classnames are inherited from bootstrap, but are present in most notebook renderers */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.alert {
 | 
					 | 
				
			||||||
    width: auto;
 | 
					 | 
				
			||||||
    padding: 1em;
 | 
					 | 
				
			||||||
    margin-top: 1em;
 | 
					 | 
				
			||||||
    margin-bottom: 1em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.alert > *:last-child {
 | 
					 | 
				
			||||||
    margin-bottom: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#preview > .alert:last-child {
 | 
					 | 
				
			||||||
    /* Prevent this being set to zero by the default notebook stylesheet */
 | 
					 | 
				
			||||||
    padding-bottom: 1em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.alert-success {
 | 
					 | 
				
			||||||
    /* Note there is no suitable color available, so we just copy "info" */
 | 
					 | 
				
			||||||
    background-color: var(--theme-info-background);
 | 
					 | 
				
			||||||
    color: var(--theme-info-foreground);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.alert-info {
 | 
					 | 
				
			||||||
    background-color: var(--theme-info-background);
 | 
					 | 
				
			||||||
    color: var(--theme-info-foreground);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.alert-warning {
 | 
					 | 
				
			||||||
    background-color: var(--theme-warning-background);
 | 
					 | 
				
			||||||
    color: var(--theme-warning-foreground);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.alert-danger {
 | 
					 | 
				
			||||||
    background-color: var(--theme-error-background);
 | 
					 | 
				
			||||||
    color: var(--theme-error-foreground);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
 | 
					        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
 | 
				
			||||||
| 
						 | 
					@ -408,11 +373,16 @@
 | 
				
			||||||
<p>Make a copy of the second item on top of the stack.</p>
 | 
					<p>Make a copy of the second item on top of the stack.</p>
 | 
				
			||||||
<p>The direct Klingon translation for <code>QI</code> is bridge, as in a bridge over a river, which works close enough.</p>
 | 
					<p>The direct Klingon translation for <code>QI</code> is bridge, as in a bridge over a river, which works close enough.</p>
 | 
				
			||||||
<p>Errors: stackUnderflow</p>
 | 
					<p>Errors: stackUnderflow</p>
 | 
				
			||||||
<h4 id="712-rotjir">7.1.2 rot/jIr</h4>
 | 
					<h4 id="712-pickwoh">7.1.2 pick/woH</h4>
 | 
				
			||||||
 | 
					<p><em>N <code>woH</code> objN</em></p>
 | 
				
			||||||
 | 
					<p>Make a copy of the Nth item on top of the stack.</p>
 | 
				
			||||||
 | 
					<p>For example <em>1 <code>woH</code></em> is the same as <code>latlh</code> & <em>2 <code>woH</code></em> is the same as <code>QI</code></p>
 | 
				
			||||||
 | 
					<p>Errors: stackUnderflow, stackOverflow</p>
 | 
				
			||||||
 | 
					<h4 id="713-rotjir">7.1.3 rot/jIr</h4>
 | 
				
			||||||
<p><em>obj1 obj2 obj3 <code>jIr</code> obj2 obj3 obj1</em></p>
 | 
					<p><em>obj1 obj2 obj3 <code>jIr</code> obj2 obj3 obj1</em></p>
 | 
				
			||||||
<p>Rotate the third item to the top of the stack.</p>
 | 
					<p>Rotate the third item to the top of the stack.</p>
 | 
				
			||||||
<p>Errors: stackUnderflow</p>
 | 
					<p>Errors: stackUnderflow</p>
 | 
				
			||||||
<h4 id="713-depthjuv">7.1.3 depth/juv</h4>
 | 
					<h4 id="714-depthjuv">7.1.4 depth/juv</h4>
 | 
				
			||||||
<p><em>- <code>juv</code> num</em></p>
 | 
					<p><em>- <code>juv</code> num</em></p>
 | 
				
			||||||
<p>Count the number of items on the stack and push that number to the top of the stack.</p>
 | 
					<p>Count the number of items on the stack and push that number to the top of the stack.</p>
 | 
				
			||||||
<p>Errors: stackUnderflow</p>
 | 
					<p>Errors: stackUnderflow</p>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								SPEC.md
								
								
								
								
							
							
						
						
									
										15
									
								
								SPEC.md
								
								
								
								
							| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
_var'aq_ Specification
 | 
					_var'aq_ Specification
 | 
				
			||||||
==================================
 | 
					=================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For better flavor text please read the [Original `var'aq` spec](https://www.oocities.org/connorbd/varaq/varaqspec.html) the following is a trimmed down version of the spec with a couple of fixes and addendums to how this implementation of the language works.
 | 
					For better flavor text please read the [Original `var'aq` spec](https://www.oocities.org/connorbd/varaq/varaqspec.html) the following is a trimmed down version of the spec with a couple of fixes and addendums to how this implementation of the language works.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -655,8 +655,17 @@ Make a copy of the second item on top of the stack.
 | 
				
			||||||
The direct Klingon translation for `QI` is bridge, as in a bridge over a river, which works close enough.
 | 
					The direct Klingon translation for `QI` is bridge, as in a bridge over a river, which works close enough.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Errors: stackUnderflow
 | 
					Errors: stackUnderflow
 | 
				
			||||||
 | 
					#### 7.1.2 pick/woH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### 7.1.2 rot/jIr
 | 
					_N `woH` objN_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Make a copy of the Nth item on top of the stack.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For example _1 `woH`_ is the same as `latlh` & _2 `woH`_ is the same as `QI`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Errors: stackUnderflow, stackOverflow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 7.1.3 rot/jIr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_obj1 obj2 obj3 `jIr` obj2 obj3 obj1_
 | 
					_obj1 obj2 obj3 `jIr` obj2 obj3 obj1_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -664,7 +673,7 @@ Rotate the third item to the top of the stack.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Errors: stackUnderflow
 | 
					Errors: stackUnderflow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### 7.1.3 depth/juv
 | 
					#### 7.1.4 depth/juv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_- `juv` num_
 | 
					_- `juv` num_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@
 | 
				
			||||||
} repeat
 | 
					} repeat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
elves shatter depth sub1 { 
 | 
					elves shatter depth sub1 { 
 | 
				
			||||||
    over over lt? 
 | 
					    2 pick 2 pick lt? 
 | 
				
			||||||
    choose
 | 
					    choose
 | 
				
			||||||
    { pop exch pop true } ifyes
 | 
					    { pop exch pop true } ifyes
 | 
				
			||||||
    { pop } ifno
 | 
					    { pop } ifno
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								main.go
								
								
								
								
							
							
						
						
									
										3
									
								
								main.go
								
								
								
								
							| 
						 | 
					@ -20,8 +20,8 @@ func main() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func repl() {
 | 
					func repl() {
 | 
				
			||||||
	scanner := bufio.NewScanner(os.Stdin)
 | 
						scanner := bufio.NewScanner(os.Stdin)
 | 
				
			||||||
	for scanner.Scan() {
 | 
					 | 
				
			||||||
	fmt.Print("> ")
 | 
						fmt.Print("> ")
 | 
				
			||||||
 | 
						for scanner.Scan() {
 | 
				
			||||||
		line := scanner.Text()
 | 
							line := scanner.Text()
 | 
				
			||||||
		if len(line) == 0 {
 | 
							if len(line) == 0 {
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@ func repl() {
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			fmt.Printf("%v\n", err)
 | 
								fmt.Printf("%v\n", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							fmt.Print("> ")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,6 +170,33 @@ func Interpret(code Expr, argv []string) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			push(stack[n-2])
 | 
								push(stack[n-2])
 | 
				
			||||||
			stack = append(stack[:n-2], stack[n-3:]...)
 | 
								stack = append(stack[:n-2], stack[n-3:]...)
 | 
				
			||||||
 | 
							case PICK:
 | 
				
			||||||
 | 
								n := len(stack) - 1
 | 
				
			||||||
 | 
								a, e := pop()
 | 
				
			||||||
 | 
								if e != nil {
 | 
				
			||||||
 | 
									return e
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if a.Tok == IDENTIFIER {
 | 
				
			||||||
 | 
									a = get(a.Value.(string))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if a.Tok == NUMBER {
 | 
				
			||||||
 | 
									idx := int(a.Value.(float64))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if idx <= 0 {
 | 
				
			||||||
 | 
										return fmt.Errorf("`pick`: index must be a positive nonzero value")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if n-idx < 0 {
 | 
				
			||||||
 | 
										return fmt.Errorf("`pick`: stack underflow")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if idx > n {
 | 
				
			||||||
 | 
										return fmt.Errorf("`pick`: stack overflow")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									push(stack[n-idx])
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									return fmt.Errorf("cannot `pick` index is not a number @%v", idx)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case DEPTH:
 | 
							case DEPTH:
 | 
				
			||||||
			push(Expr{NUMBER, nil, float64(len(stack)), 0})
 | 
								push(Expr{NUMBER, nil, float64(len(stack)), 0})
 | 
				
			||||||
		case CLEAR:
 | 
							case CLEAR:
 | 
				
			||||||
| 
						 | 
					@ -1232,7 +1259,7 @@ func Interpret(code Expr, argv []string) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			fmt.Println(localAddr.IP.String())
 | 
								fmt.Println(localAddr.IP.String())
 | 
				
			||||||
		case VERSION:
 | 
							case VERSION:
 | 
				
			||||||
			fmt.Println("var'aq -- 0.9.0 Martoq")
 | 
								fmt.Println("var'aq -- 0.9.1 Martoq")
 | 
				
			||||||
		case ARGV:
 | 
							case ARGV:
 | 
				
			||||||
			arg := Expr{LIST, make([]Expr, 0), nil, 0}
 | 
								arg := Expr{LIST, make([]Expr, 0), nil, 0}
 | 
				
			||||||
			for _, v := range argv {
 | 
								for _, v := range argv {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,6 +181,8 @@ var keywords = map[string]TokenType{
 | 
				
			||||||
	"QI":    OVER,
 | 
						"QI":    OVER,
 | 
				
			||||||
	"depth": DEPTH,
 | 
						"depth": DEPTH,
 | 
				
			||||||
	"juv":   DEPTH,
 | 
						"juv":   DEPTH,
 | 
				
			||||||
 | 
						"pick":  PICK,
 | 
				
			||||||
 | 
						"woH":   PICK,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isDigit(s string) bool {
 | 
					func isDigit(s string) bool {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,6 +105,7 @@ const (
 | 
				
			||||||
	OVER
 | 
						OVER
 | 
				
			||||||
	ROT
 | 
						ROT
 | 
				
			||||||
	DEPTH
 | 
						DEPTH
 | 
				
			||||||
 | 
						PICK
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var tokens = [...]string{
 | 
					var tokens = [...]string{
 | 
				
			||||||
| 
						 | 
					@ -209,6 +210,7 @@ var tokens = [...]string{
 | 
				
			||||||
	OVER:           "OVER",
 | 
						OVER:           "OVER",
 | 
				
			||||||
	ROT:            "ROT",
 | 
						ROT:            "ROT",
 | 
				
			||||||
	DEPTH:          "DEPTH",
 | 
						DEPTH:          "DEPTH",
 | 
				
			||||||
 | 
						PICK:           "PICK",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (me TokenType) String() string {
 | 
					func (me TokenType) String() string {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue