【问题标题】:Setting language with #lang in the REPL在 REPL 中使用#lang 设置语言
【发布时间】:2014-01-27 07:39:45
【问题描述】:

我想使用#lang 即时设置REPL 中的语言,而不是使用“-I”命令行参数。但这给了我错误“读取:#lang not enabled in the current context”。

是否有我缺少的命令行开关?或者也许我可以使用“,元命令”?我需要这个的原因是因为我希望能够将 Emacs 缓冲区发送到 Racket REPL,但如果文件以 #lang 开头,这将不起作用。

【问题讨论】:

    标签: racket geiser


    【解决方案1】:

    使用 Racket & Geiser 通过#lang sicp 进行 SICP 时,我很难理解这一点。终于想通了。基于以上所有好的答案,这些是提醒自己要做什么以及为什么要做的 cmets:

    #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)
    

    Racket 和 Geiser 是两个了不起的软件,几乎要放弃了,但值得为此付出努力。感谢所有人的出色工作并帮助我们学习。

    【讨论】:

      【解决方案2】:

      [编辑]

      我也无法让C-x C-b#lang 合作。

      但是可以将包含#lang 的缓冲区发送到从 Geiser 以C-c C-a 启动的 REPL。这是从 Geiser 下拉菜单中切换到 REPL 并进入模块。如果我有 bugsy.rkt 的缓冲区:

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

      在 REPL 中输入 C-c C-a 会给我这个:

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

      然后我可以访问 REPL 中的模块:

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

      如果我想切换到不同的模块[或文件的缓冲区],我可以在 REPL 中使用,enter 命令:

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

      文档中有,enter 命令的示例。 Look above the Dinosaur.

      [原创]

      根据 Racket 文档#langhas very simple syntax,读者基本上从#lang 之后的空格字符后面引导语言语法。这意味着在某种意义上#lang 不在 Racket 的 [或任何其他语言的] 语法中。相反,它是阅读器的一个实现特性,构成了更大的“Racket”开发生态系统的一部分。

      Geiser [可能是 Quack 和球拍模式] 通过在将代码传递给 Racket REPL 之前在 elsip 中解析 #lang 来处理这个问题。在 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"))
      

      它在第 166 行被geiser-racket--geiser-procedure 调用。

      (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 模式之一不能满足您的需求,这可能会为您提供滚动您自己的代码的起点。

      【讨论】:

      • 所以 Geiser 可以将 #lang 指令转换为可在 Racket REPL 中运行的代码,但是它在哪里使用呢?当然,运行 C-c C-b, geiser-eval-buffer 不会这样做,它只是直接通过#lang,导致与上述相同的错误。 (使用 MELPA 的最新 Geiser 进行测试。)
      • @DavorCubranic 我添加了有关 Geiser REPL 的其他信息
      • 谢谢,这回答了我真正想要的。虽然我最终可能会使用@GregHendershott 的球拍模式,因为它更接近 DrRacket 体验。
      • 在geiser中我也可以输入一个模块,通过[Cu Cc Cz],你可以在这篇文章中看到解释:lists.nongnu.org/archive/html/geiser-users/2012-12/…,我试过#lang racket#lang web-server/insta,两者都作为预期的。请注意,我不能在暂存缓冲区中执行 [C-u C-c C-z] - 我必须首先将缓冲区保存到命名文件中。
      【解决方案3】:
      ; foo.rkt
      #lang whatever
      "hi"
      

      基本一样

      (module foo whatever
        "hi")
      

      因此,作为一种快速破解,您可能可以切掉 #lang 行,从中取出 lang,然后在 comint-send-input 之前将缓冲区的其余部分填充到 (module ...) 表单中。

      更简单,如果您不介意将缓冲区保存到磁盘,首先:只需将 ,enter /path/to/file.rkt 发送到 REPL 缓冲区,或者如果您不使用 XREPL,则发送 (enter! "/path/to/file.rkt")

      另外,值得一提的是一些与 Racket 相关的模式:

      其中一个可能已经做了您想做的事情,或者,您可以窥探它们的工作原理(每个都采用不同的方法)。

      【讨论】:

      • 啊,球拍模式,看起来正是我需要的!
      • 备案:当我写这个答案时,问题没有提到 Geiser。后来,别人编辑了这个问题,添加了一个 Geiser 标签,然后在此基础上写了一个答案。
      • @GregHendershott 在球拍模式下最好的方法是什么?我正在尝试使用#lang sicp 通过 SICP,我很好奇这是否可以轻松地与球拍模式一起使用。
      • 1.使用.rkt 文件创建或切换到缓冲区。 2. 做C-c C-c 又名racket-run。 3. 利润。
      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2020-04-19
      • 2013-09-28
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多