質問

REPLでその場で言語を設定したいのですが、 #lang, 、「-I」コマンドライン引数は使用しません。しかし、これにより「read:」というエラーが発生します。#lang は現在のコンテキストでは有効になっていません。」

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

役に立ちましたか?

解決

[編集]

手に入らない C-x C-b 一緒に働く #lang どちらか。

しかし、バッファには次のものが含まれています #lang Geiser から開始された REPL に送信できます。 C-c C-a. 。これは 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 ドキュメントのコマンド。 恐竜の上を見てみよう.

[オリジナル]

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

Geiser [そしておそらく Quack とラケットモード] は解析することでこれを処理します #lang コードを Racket REPL に渡す前に elsip で実行します。Geiser では、作業は次のように行われます。 ガイザーラケット.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-procedure 166行目。

(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 つがニーズを満たさない場合に、独自のコードをローリングするための出発点となる可能性があります。

他のヒント

; foo.rkt
#lang whatever
"hi"

基本的にはと同じです

(module foo whatever
  "hi")

したがって、簡単なハックとして、おそらく #lang 行を作成し、そこから lang を取得し、残りのバッファをその中に詰め込みます。 (module ...) 前にフォーム comint-send-input-やってるよ。

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

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

そのうちの 1 つはすでにあなたが望むことを実行しているかもしれませんし、それらがどのように機能するかを覗いてみることもできます (それぞれがこれに対して多少異なるアプローチをとっています)。

私はラケットとジオザーを使ってこれを中心とした本当に苦労した時間がありました。ついにそれを考え出した。上記のすべての答えに基づいて、これらは何をすべきかを思い出させるためのコメントとなぜですか?

#lang sicp
;;C-c C-a loads #lang module into REPL (save before loading)
;;C-u C-c C-z is faster than C-c C-a
;;https://docs.racket-lang.org/sicp-manual/index.html
;;https://stackoverflow.com/questions/21008623/setting-language-with-lang-in-the-repl
(#%require sicp-pict)
(paint einstein)
.

ラケットと地方自治体は2つの素晴らしいソフトウェアですが、ほとんどあきらめましたが、この作業を得るための努力の価値がありました。良い仕事のために、そして私たちが学ぶのを助けてくれてありがとう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top