Shell脚本出错,无法以交互方式运行Racket程序

时间:2019-10-23 22:35:44

标签: shell racket

我制作了一个shell脚本,该脚本接收一个球拍文件作为参数,并使用它来运行以下命令来执行该文件并保持交互模式。

racket -i -e '(enter! "filename.rkt")'

问题是,当我运行脚本时,上面的命令在执行时没有最后的单引号,这会生成错误消息。

我尝试在命令的末尾(在脚本内)放置更多字符,以查看它是否只是忽略了最后一个字符,但这没有用。

这是我的剧本:

# rkt.sh

if [ "$#" -ne 1 ]; then
    echo "Not enough parameters!"
else
    option=\''(enter! "'$1'")'\'
    racket -i -e "$path"
fi

运行命令后:

rkt test.rkt

这是球拍程序显示的错误:

Welcome to Racket v7.0.
'(enter! "test.rkt")
string::21: read-syntax: expected an element for quoting "'", found end-of-file
  context...:
   reader-error12
   read-undotted
   read-syntax

但是当我回显脚本的变量选项时,它会显示所需的结果:

'(enter! "test.rkt")'

2 个答案:

答案 0 :(得分:1)

Scheme实现中的单引号和Racket之类的后代用于文字数据,您无需将它们配对。

出现错误消息是因为它已读取'(enter! "test.rkt")并将其评估为(enter! "test.rkt"),尽管您具有标准的球拍打印模式,该模式不显示tha值,而是一个可以评估该值的值。因此'(enter! "test.rkt")。此后,它已读取',但数据并未在那里得到报价。 'x有效'无效。

我猜这就是您想要的:

#/bin/sh

if [ "$#" -ne 1 ]; then
    echo "Not enough parameters!"
else
    option="(enter! \"$1\")"
    racket -i -e "$option"
fi

虽然可以加载该文件,但它可能创建的定义似乎不可用。因此,在完成其操作后处于交互模式不会提供太多功能。

答案 1 :(得分:0)

这是一种写我认为在球拍中要记住的内容的方法,而无需经过Bash。只需chmod +x个文件即可。

#!/usr/bin/env racket
#lang racket/base

(require racket/cmdline)

(define file
  (command-line
   #:usage-help "start a Racket REPL inside the module <file>"
   #:args (file)
   file))

(void (write-string (banner)))

(define ns (make-base-namespace))
(parameterize ([current-namespace ns])
  (eval '(require racket/init racket/interactive))
  (eval `(enter! ,file))
  (read-eval-print-loop))