3 Commits

Author SHA1 Message Date
T.v.Dein
64e66e9d7b bump version (#9) 2023-11-07 14:19:47 +01:00
T.v.Dein
23a4d87514 add screencast (#8) 2023-11-07 14:19:32 +01:00
T.v.Dein
2ce8cc7a7e add comments support (#7) 2023-11-07 14:18:46 +01:00
10 changed files with 122 additions and 4 deletions

View File

@@ -57,8 +57,8 @@ test:
go test -v ./...
singletest:
@echo "Call like this: ''make singletest TEST=TestPrepareColumns MOD=lib"
go test -run $(TEST) github.com/tlinden/rpn/$(MOD)
@echo "Call like this: ''make singletest TEST=TestPrepareColumns"
go test -run $(TEST)
cover-report:
go test ./... -cover -coverprofile=coverage.out

View File

@@ -21,7 +21,11 @@ Features:
- provides interactive repl
- completion
- history
- comments (comment character is `#`)
## Demo
![asciicast](demo/demo.gif)
## Working principle

View File

@@ -38,6 +38,7 @@ type Calc struct {
completer readline.AutoCompleter
interpreter *Interpreter
Space *regexp.Regexp
Comment *regexp.Regexp
Constants []string
LuaFunctions []string
@@ -133,6 +134,7 @@ func NewCalc() *Calc {
)
c.Space = regexp.MustCompile(`\s+`)
c.Comment = regexp.MustCompile(`#.*`) // ignore everything after #
// pre-calculate mode switching arrays
c.Constants = strings.Split(Constants, " ")
@@ -189,7 +191,8 @@ func (c *Calc) Prompt() string {
// the actual work horse, evaluate a line of calc command[s]
func (c *Calc) Eval(line string) {
line = strings.TrimSpace(line)
// remove surrounding whitespace and comments, if any
line = strings.TrimSpace(c.Comment.ReplaceAllString(line, ""))
if line == "" {
return

View File

@@ -22,6 +22,79 @@ import (
"testing"
)
func TestCommentsAndWhitespace(t *testing.T) {
calc := NewCalc()
var tests = []struct {
name string
cmd []string
exp float64 // last element of the stack
}{
{
name: "whitespace prefix",
cmd: []string{" 5"},
exp: 5.0,
},
{
name: "whitespace postfix",
cmd: []string{"5 "},
exp: 5.0,
},
{
name: "whitespace both",
cmd: []string{" 5 "},
exp: 5.0,
},
{
name: "comment line w/ spaces",
cmd: []string{"5", " # 19"},
exp: 5.0,
},
{
name: "comment line w/o spaces",
cmd: []string{"5", `#19`},
exp: 5.0,
},
{
name: "inline comment w/ spaces",
cmd: []string{"5 # 19"},
exp: 5.0,
},
{
name: "inline comment w/o spaces",
cmd: []string{"5#19"},
exp: 5.0,
},
}
for _, tt := range tests {
testname := fmt.Sprintf("%s .(expect %.2f)",
tt.name, tt.exp)
t.Run(testname, func(t *testing.T) {
for _, line := range tt.cmd {
calc.Eval(line)
}
got := calc.stack.Last()
if len(got) > 0 {
if got[0] != tt.exp {
t.Errorf("parsing failed:\n+++ got: %f\n--- want: %f",
got, tt.exp)
}
}
if calc.stack.Len() != 1 {
t.Errorf("invalid stack size:\n+++ got: %d\n--- want: 1",
calc.stack.Len())
}
})
calc.stack.Clear()
}
}
func TestCalc(t *testing.T) {
calc := NewCalc()

7
demo/Makefile Normal file
View File

@@ -0,0 +1,7 @@
#
all:
asciinema rec --cols 80 --row 25 -c "env - PS1='> ' PATH=..:$PATH /bin/bash --norc --noprofile" --overwrite demo.cast
agg demo.cast demo.gif

3
demo/demo.cast Normal file
View File

@@ -0,0 +1,3 @@
{"version": 2, "width": 80, "height": 25, "timestamp": 1699358215, "env": {"SHELL": "/bin/bash", "TERM": "tmux-256color"}}
[0.005628, "o", "> "]
[0.941195, "o", "exit\r\n"]

BIN
demo/demo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 KiB

18
demo/sessions.txt Normal file
View File

@@ -0,0 +1,18 @@
# demo sessions, used to create an interactive rpn recording
# part 1: interactive
# put some numbers onto the stack
2 4 6
8
10
# take a look at the stack
dump
# add the last 2
+
# multiply the result and the previous
*

View File

@@ -30,7 +30,7 @@ import (
lua "github.com/yuin/gopher-lua"
)
const VERSION string = "2.0.3"
const VERSION string = "2.0.4"
const Usage string = `This is rpn, a reverse polish notation calculator cli.

10
rpn.pod
View File

@@ -213,6 +213,16 @@ Search through history.
=back
=head1 COMMENTS
Lines starting with C<#> are being ignored as comments. You can also
append comments to rpn input, e.g.:
# a comment
123 # another comment
In this case only 123 will be added to the stack.
=head1 EXTENDING RPN USING LUA
You can use a lua script with lua functions to extend the