سؤال

أرغب في ضبط اللغة في REPL بسرعة، باستخدام #lang, ، وعدم استخدام وسيطة سطر الأوامر "-I".لكن هذا يعطيني الخطأ "اقرأ:#lang غير ممكّن في السياق الحالي".

هل هناك مفتاح سطر أوامر أفتقده؟أو ربما "،الأمر الوصفي" الذي يمكنني استخدامه؟سبب حاجتي لهذا هو أنني أرغب في إرسال مخزن Emacs المؤقت إلى Racket REPL، لكن هذا لن ينجح إذا كان الملف يبدأ بـ #lang.

هل كانت مفيدة؟

المحلول

[يحرر]

لا أستطيع الحصول على C-x C-b للعمل مع #lang أيضاً.

لكن المخزن المؤقت يحتوي على #lang يمكن إرسالها إلى REPL التي بدأت من Geiser مع C-c C-a.هذا هو قم بالتبديل إلى REPL وأدخل الوحدة من القائمة المنسدلة Geiser.إذا كان لدي مخزن مؤقت لـ 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 وRacket على الأرجح] مع هذا عن طريق التحليل #lang في elsip قبل تمرير التعليمات البرمجية إلى Racket REPL.في جيزر، يتم العمل في 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-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 الحالية لا يلبي احتياجاتك.

نصائح أخرى

; foo.rkt
#lang whatever
"hi"

هو أساسا نفس

(module foo whatever
  "hi")

وذلك سريع هاك ربما شريحة قبالة #lang خط انتزاع لانغ ، الاشياء بقية العازلة داخل (module ...) شكل قبل comint-send-input-ing ذلك.

حتى أسهل إذا كنت لا تمانع في توفير المخزن المؤقت إلى القرص الأول:فقط أرسل أكثر ,enter /path/to/file.rkt إلى REPL العازلة ، أو إذا كنت لا تستخدم XREPL, (enter! "/path/to/file.rkt").

كما انه من الجدير بالذكر بضع مضرب ذات الصلة وسائط:

واحد منهم قد تفعل ما تريد ، أو يمكن أن خاطفة إلى كيفية عملها (كل يأخذ نهجا مختلفا إلى حد ما هذا).

لقد واجهت وقتًا عصيبًا حقًا في الالتفاف حول هذا الأمر باستخدام Racket & Geiser للذهاب عبر SICP #lang sicp.وأخيرا برزت بها.بناءً على جميع الإجابات الجيدة المذكورة أعلاه، هذه تعليقات لتذكير نفسي بما يجب أن أفعله ولماذا:

#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 برنامجين رائعين، وقد تم التخلي عنهما تقريبًا، لكن الأمر كان يستحق الجهد المبذول لتفعيله.شكرا للجميع على العمل الجيد ومساعدتنا على التعلم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top