20

#lang「-I」コマンドライン引数を使用せずに、その場で REPL に言語を設定したいと思います。しかし、これにより「read: #lang not enabled in the current context」というエラーが表示されます。

不足しているコマンド ライン スイッチはありますか? それとも、「、メタコマンド」を使用できますか?これが必要な理由は、Emacs バッファーを Racket REPL に送信できるようにしたいからですが、ファイルが . で始まる場合は機能しません#lang

4

3 に答える 3

11

[編集]

C-x C-bどちらとも仕事ができません#lang

しかし、 を含むバッファ#langは、Geiser から開始された REPL に送信できますC-c C-a。これは、Geiser ドロップダウン メニューからREPL に切り替えてモジュールに入るというものです。bugsy.rkt のバッファがある場合:

;; bugsy.rkt
#lang racket
(define k 6)
(define j 7)
(define (f lhs rhs)
   (+ lhs rhs))

タイプC-c C-aすると、REPL で次のようになります。

racket@> ,enter "<filepath>/bugsy.rkt"
racket@bugsy.rkt>

その後、REPL でモジュールにアクセスできます。

racket@bugsy.rkt> k
6
racket@bugsy.rkt> (f 3 4)
7

別のモジュール [またはファイルのバッファー] に切り替えたい場合は,enter、REPL で次のコマンドを使用できます。

racket@bugsy.rkt> ,enter "clyde.rkt"
racket@clyde.rkt> ,enter "bonny.rkt"
racket@bonny.rkt>

,enterドキュメントにコマンドの例があります。恐竜の上を見てください

[オリジナル]

ラケットのドキュメントによると、#lang 構文は非常に単純であり、リーダーは基本的に、スペース文字の後に続くものから言語構文をブートストラップします#lang。これはある意味で#lang、Racket [または他の言語] の構文にないことを意味します。代わりに、より大きな「Racket」開発エコシステムの一部を形成するリーダーの実装機能です。

Geiser [およびおそらく Quack とラケットモード]#langは、コードを Racket REPL に渡す前に elsip で解析することによってこれを処理します。Geiser では、作業はgeiser-racket.elで行われます。

解析関数は 132 行にあります。

(defun geiser-racket--language ()
  (or (cdr (geiser-racket--explicit-module))
      (save-excursion
        (goto-char (point-min))
        (if (re-search-forward "^#lang +\\([^ ]+\\)" nil t)
            (geiser-syntax--form-from-string (match-string-no-properties 1))))
      "#f"))

そして、geiser-racket--geiser-procedure166行目で呼び出されます。

(defun geiser-racket--geiser-procedure (proc &rest args)
  (case proc
    ((eval compile)
     (format ",geiser-eval %s %s %s"
             (or (car args) "#f")
             (geiser-racket--language)
             (mapconcat 'identity (cdr args) " ")))
    ((load-file compile-file)
     (format ",geiser-load %S" (geiser-racket--find-module)))
    ((no-values) ",geiser-no-values")
    (t (format ",apply geiser:%s (%s)" proc (mapconcat 'identity args " ")))))

これは、既存の Emacs モードの 1 つがニーズを満たさない場合に、独自のコードを展開するための出発点となる可能性があります。

于 2014-01-09T16:03:44.107 に答える
5
; foo.rkt
#lang whatever
"hi"

基本的に同じです

(module foo whatever
  "hi")

したがって、簡単なハックとして、おそらく#lang行を切り取り、そこから lang を取得し、残りのバッファを(module ...)フォーム内に詰め込んでからcomint-send-input-ing することができます。

バッファーをディスクに保存しても構わない場合は、さらに簡単です。まず,enter /path/to/file.rkt、REPL バッファーに送信するか、XREPL を使用していない場合は、(enter! "/path/to/file.rkt").

また、Racket に関連するいくつかのモードについて言及する価値があります。

そのうちの 1 つは、既に目的を達成している可能性があります。または、それらがどのように機能するかを確認することもできます (それぞれのアプローチは多少異なります)。

于 2014-01-09T01:23:48.053 に答える