forked from Archives/fx
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
733 B
Go
47 lines
733 B
Go
2 years ago
|
package reducer
|
||
|
|
||
|
import (
|
||
|
_ "embed"
|
||
|
"fmt"
|
||
|
"os/exec"
|
||
|
)
|
||
|
|
||
|
func CreateRuby(args []string) *exec.Cmd {
|
||
|
cmd := exec.Command("ruby", "-e", ruby(args))
|
||
|
return cmd
|
||
|
}
|
||
|
|
||
|
//go:embed reduce.rb
|
||
|
var templateRuby string
|
||
|
|
||
|
func ruby(args []string) string {
|
||
|
rs := "\n"
|
||
|
for i, a := range args {
|
||
|
rs += "begin"
|
||
|
switch {
|
||
|
case a == ".":
|
||
|
rs += `
|
||
|
x = x
|
||
|
`
|
||
|
|
||
|
default:
|
||
|
rs += fmt.Sprintf(
|
||
|
`
|
||
|
x = lambda {|x| %v }.call(x)
|
||
|
`, a)
|
||
|
}
|
||
|
// Generate a beautiful error message.
|
||
|
rs += "rescue Exception => e\n"
|
||
|
pre, post, pointer := trace(args, i)
|
||
|
rs += fmt.Sprintf(
|
||
|
` STDERR.puts "\n #{%q} #{%q} #{%q}\n %v\n\n#{e}\n"
|
||
|
exit(1)
|
||
|
`,
|
||
|
pre, a, post,
|
||
|
pointer,
|
||
|
)
|
||
|
rs += "end\n"
|
||
|
}
|
||
|
return fmt.Sprintf(templateRuby, rs)
|
||
|
}
|