Add MEASURE fix List operators
This commit is contained in:
parent
1b26f3e65a
commit
8edcea969e
|
@ -1 +1 @@
|
||||||
(1 2 3 4 "test this" pi(*test*)) empty? disp
|
("test this" (*test*) ) pi cons 2 cons 1 cons 4 { split exch disp newline } repeat
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/rc
|
||||||
|
exec bin/varaq examples/http_read.vqe >>[2]/sys/log/www
|
|
@ -352,14 +352,14 @@ func Interpret(code Expr, argv []string, w io.Writer) error {
|
||||||
return fmt.Errorf("cannot `split` not a list @%v", idx)
|
return fmt.Errorf("cannot `split` not a list @%v", idx)
|
||||||
}
|
}
|
||||||
case CONS:
|
case CONS:
|
||||||
list, e := pop()
|
|
||||||
if e != nil {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
o, eo := pop()
|
o, eo := pop()
|
||||||
if eo != nil {
|
if eo != nil {
|
||||||
return eo
|
return eo
|
||||||
}
|
}
|
||||||
|
list, e := pop()
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
if list.Tok == LIST {
|
if list.Tok == LIST {
|
||||||
list.Exprs = append(list.Exprs, o)
|
list.Exprs = append(list.Exprs, o)
|
||||||
push(list)
|
push(list)
|
||||||
|
@ -378,6 +378,16 @@ func Interpret(code Expr, argv []string, w io.Writer) error {
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("cannot `shatter` not a list @%v", idx)
|
return fmt.Errorf("cannot `shatter` not a list @%v", idx)
|
||||||
}
|
}
|
||||||
|
case MEASURE:
|
||||||
|
list, e := pop()
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
if list.Tok == LIST {
|
||||||
|
push(Expr{NUMBER, nil, float64(len(list.Exprs)), 0})
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("cannot `measure` not a list @%v", idx)
|
||||||
|
}
|
||||||
case EMPTY:
|
case EMPTY:
|
||||||
list, e := pop()
|
list, e := pop()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
|
@ -1014,11 +1024,35 @@ func Interpret(code Expr, argv []string, w io.Writer) error {
|
||||||
fmt.Fprintf(w, "%v", a.Value)
|
fmt.Fprintf(w, "%v", a.Value)
|
||||||
}
|
}
|
||||||
case LISTEN:
|
case LISTEN:
|
||||||
// FIXME: should there be a way to do this in wasm??
|
|
||||||
if runtime.GOARCH == "wasm" {
|
if runtime.GOARCH == "wasm" {
|
||||||
return nil
|
// In WASM mode fetch does a fetch request from a foreign website
|
||||||
|
|
||||||
|
v1, e := pop()
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if v1.Tok == STRING {
|
||||||
|
url := v1.Value.(string)
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
// we will get an error at this stage if the request fails, such as if the
|
||||||
|
// requested URL is not found, or if the server is not reachable.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// print the response
|
||||||
|
data, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
push(Expr{STRING, nil, string(data), 0})
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("cannot `streq?` value is not a string @%v", idx)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
var str string
|
var str string
|
||||||
|
|
||||||
s.Scan()
|
s.Scan()
|
||||||
|
@ -1028,6 +1062,7 @@ func Interpret(code Expr, argv []string, w io.Writer) error {
|
||||||
return s.Err()
|
return s.Err()
|
||||||
}
|
}
|
||||||
push(Expr{STRING, nil, str, 0})
|
push(Expr{STRING, nil, str, 0})
|
||||||
|
}
|
||||||
case COMPLAIN:
|
case COMPLAIN:
|
||||||
a, e := popExpr()
|
a, e := popExpr()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
|
|
208
varaq/token.go
208
varaq/token.go
|
@ -4,109 +4,110 @@ type TokenType int64
|
||||||
|
|
||||||
const (
|
const (
|
||||||
UNDEFINED TokenType = iota
|
UNDEFINED TokenType = iota
|
||||||
IDENTIFIER
|
IDENTIFIER // id
|
||||||
STRING
|
STRING // string
|
||||||
NUMBER
|
NUMBER // float
|
||||||
BOOLEAN
|
BOOLEAN // bool
|
||||||
LIST
|
LIST // list
|
||||||
SCRIPT
|
SCRIPT // script
|
||||||
FUNCTION
|
FUNCTION // function
|
||||||
ERROR
|
ERROR // error
|
||||||
LEFTPAREN
|
LEFTPAREN // (
|
||||||
RIGHTPAREN
|
RIGHTPAREN // )
|
||||||
LEFTBRACE
|
LEFTBRACE // {
|
||||||
RIGHTBRACE
|
RIGHTBRACE // }
|
||||||
TILDE
|
TILDE // The ~ operator is a special form, as it is not a postfix operator. When the interpreter encounters a ~, it pushes the next token on the stack as is regardless of whether it is a defined name.
|
||||||
SLASH
|
SLASH // /
|
||||||
STAR
|
STAR // *
|
||||||
FALSE
|
FALSE // false
|
||||||
TRUE
|
TRUE // true
|
||||||
PI
|
PI // 3.14159
|
||||||
E
|
E // 2.718
|
||||||
EOF
|
EOF // end of file
|
||||||
POP
|
POP // Pops and discards the top item on the stack. The literal meaning is discard.
|
||||||
DUP
|
DUP // Duplicates the top object on the stack.
|
||||||
EXCH
|
EXCH // Inverts the order of the top two objects on the stack.
|
||||||
CLEAR
|
CLEAR // Empties the stack.
|
||||||
REMEMBER
|
REMEMBER // Puts a flag (like PostScript’s mark) on the stack. The internal representation of the flag is not available to the programmer.
|
||||||
FORGET
|
FORGET // Clears the stack down to the flag and pops the flag. If there is no flag present, the stack is emptied completely.
|
||||||
DUMP
|
DUMP // Prints the contents of the operand stack to STDOUT without changing them.
|
||||||
NAME
|
NAME // Associates obj with id and places it in the system lookup space. Conventionally used to associate new operator names with procedure objects.
|
||||||
SET
|
SET // Reassigns the value of a value already in the system lookup space. Used primarily for variable assignments.
|
||||||
IFYES
|
IFYES //
|
||||||
IFNO
|
IFNO //
|
||||||
CHOOSE
|
CHOOSE //
|
||||||
EVAL
|
EVAL //
|
||||||
ESCAPE
|
ESCAPE //
|
||||||
REPEAT
|
REPEAT //
|
||||||
SPLIT
|
SPLIT //
|
||||||
CONS
|
CONS //
|
||||||
SHATTER
|
SHATTER //
|
||||||
EMPTY
|
MEASURE //
|
||||||
COMPOSE
|
EMPTY //
|
||||||
STREQ
|
COMPOSE //
|
||||||
STRCUT
|
STREQ //
|
||||||
STRMEASURE
|
STRCUT //
|
||||||
STRTIE
|
STRMEASURE //
|
||||||
EXPLODE
|
STRTIE //
|
||||||
ADD
|
EXPLODE //
|
||||||
SUB
|
ADD //
|
||||||
MUL
|
SUB //
|
||||||
DIV
|
MUL //
|
||||||
IDIV
|
DIV //
|
||||||
MOD
|
IDIV //
|
||||||
POW
|
MOD //
|
||||||
SQRT
|
POW //
|
||||||
ADD1
|
SQRT //
|
||||||
SUB1
|
ADD1 //
|
||||||
SIN
|
SUB1 //
|
||||||
COS
|
SIN //
|
||||||
TAN
|
COS //
|
||||||
ATAN
|
TAN //
|
||||||
LN
|
ATAN //
|
||||||
LOG
|
LN //
|
||||||
LOG3
|
LOG //
|
||||||
CLIP
|
LOG3 //
|
||||||
SMOOTH
|
CLIP //
|
||||||
HOWMUCH
|
SMOOTH //
|
||||||
SETRAND
|
HOWMUCH //
|
||||||
RAND
|
SETRAND //
|
||||||
NUMBERIZE
|
RAND //
|
||||||
ISOLATE
|
NUMBERIZE //
|
||||||
MIX
|
ISOLATE //
|
||||||
CONTRADICT
|
MIX //
|
||||||
COMPL
|
CONTRADICT //
|
||||||
SHIFTRIGHT
|
COMPL //
|
||||||
SHIFTLEFT
|
SHIFTRIGHT //
|
||||||
GT
|
SHIFTLEFT //
|
||||||
LT
|
GT //
|
||||||
EQ
|
LT //
|
||||||
GE
|
EQ //
|
||||||
LE
|
GE //
|
||||||
NE
|
LE //
|
||||||
NULL
|
NE //
|
||||||
NEGATIVE
|
NULL //
|
||||||
ISNULL
|
NEGATIVE //
|
||||||
ISINT
|
ISNULL //
|
||||||
ISNUMBER
|
ISINT //
|
||||||
AND
|
ISNUMBER //
|
||||||
OR
|
AND //
|
||||||
XOR
|
OR //
|
||||||
DISP
|
XOR //
|
||||||
LISTEN
|
DISP //
|
||||||
COMPLAIN
|
LISTEN //
|
||||||
NEWLINE
|
COMPLAIN //
|
||||||
TAB
|
NEWLINE //
|
||||||
WHEREAMI
|
TAB //
|
||||||
VERSION
|
WHEREAMI //
|
||||||
ARGV
|
VERSION //
|
||||||
TIME
|
ARGV //
|
||||||
GARBAGECOLLECT
|
TIME //
|
||||||
OVER
|
GARBAGECOLLECT //
|
||||||
ROT
|
OVER //
|
||||||
DEPTH
|
ROT //
|
||||||
SERVEHTTP
|
DEPTH //
|
||||||
READALL
|
SERVEHTTP //
|
||||||
|
READALL //
|
||||||
)
|
)
|
||||||
|
|
||||||
var tokens = [...]string{
|
var tokens = [...]string{
|
||||||
|
@ -148,6 +149,7 @@ var tokens = [...]string{
|
||||||
SPLIT: "SPLIT",
|
SPLIT: "SPLIT",
|
||||||
CONS: "CONS",
|
CONS: "CONS",
|
||||||
SHATTER: "SHATTER",
|
SHATTER: "SHATTER",
|
||||||
|
MEASURE: "MEASURE",
|
||||||
EMPTY: "EMPTY?",
|
EMPTY: "EMPTY?",
|
||||||
COMPOSE: "COMPOSE",
|
COMPOSE: "COMPOSE",
|
||||||
STREQ: "STREQ?",
|
STREQ: "STREQ?",
|
||||||
|
|
Loading…
Reference in New Issue