Ошибка скрипта оболочки для запуска программы Racket в интерактивном режиме - PullRequest
0 голосов
/ 24 октября 2019

Я создал сценарий оболочки, который получает файл ракетки в качестве параметра и использует его для запуска команды ниже, чтобы выполнить файл и остаться в интерактивном режиме.

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

Но когда я повторяю переменную скрипта option , она печатает желаемый результат:

'(enter! "test.rkt")'

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Одиночные кавычки в реализациях Scheme и потомках, таких как Racket, используются для литеральных данных, и вы их не объединяете.

Сообщение об ошибке приходит, потому что оно прочитало '(enter! "test.rkt") и оценило его как (enter! "test.rkt"), хотя у вас есть стандартный режим печати Racket, который не показывает значение, а скорее значение, которое будет оцениваться по этому значению. Таким образом '(enter! "test.rkt"). После этого он прочитал ', но вместо того, чтобы получить то, что указано, данные на этом заканчиваются. 'x допустимо ' нет.

Я предполагаю, что это то, что вы хотите:

#/bin/sh

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

Пока вы получаете его для загрузки файла, определения, которые он может создатьне кажется доступнымТаким образом, находясь в интерактивном режиме после того, как он это сделал, он не обеспечивает большой функциональности.

0 голосов
/ 27 октября 2019

Вот способ написать то, что, я думаю, вы имеете в виду в Racket, не проходя через 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))
...