سؤال

هل يمكنني إطلاق Squeak كإعادة (بدون واجهة المستخدم الرسومية) ، حيث يمكنني إدخال وتقييم تعبيرات SmallTalk؟ أعرف أن الصورة الافتراضية لا تسمح بذلك. هل هناك أي وثائق حول كيفية إنشاء صورة أدنى يمكن الوصول إليها من قذيفة سطر الأوامر؟

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

المحلول

فيما يلي حل (اختراق): أولاً ، تحتاج إلى OSProcess ، لذا قم بتشغيل هذا في مساحة العمل:

Gofer new squeaksource:'OSProcess'; package:'OSProcess';load.

بعد ذلك ، ضع هذا في ملف repl.st:

OSProcess thisOSProcess stdOut 
  nextPutAll: 'Welcome to the simple Smalltalk REPL'; 
  nextPut: Character lf; nextPut: $>; flush.
[ |input|
  [ input := OSProcess readFromStdIn.
    input size > 0 ifTrue: [
      OSProcess thisOSProcess stdOut 
        nextPutAll: ((Compiler evaluate: input) asString; 
        nextPut: Character lf; nextPut: $>; flush 
    ]
  ] repeat.
]forkAt: (Processor userBackgroundPriority)

وأخيراً ، قم بتشغيل هذا الأمر:

squeak -headless path/to/squeak.image /absolute/path/to/repl.st

يمكنك الآن الاستمتاع باستبدال صغير. لا تنسى كتابة الأمر:

Smalltalk snapshot:true andQuit:true

إذا كنت تريد حفظ التغييرات الخاصة بك.

الآن ، على شرح هذا الحل: OsProcess هي حزمة تسمح بتشغيل عمليات أخرى ، وقراءة من stdin ، والكتابة إلى stdout و stderr. يمكنك الوصول إلى stdout anganablefilestream OSProcess thisOSProcess (العملية الحالية ، الملقب صرير).

بعد ذلك ، يمكنك تشغيل حلقة لا حصر لها في userbackgroundpriority (للسماح للعمليات الأخرى بتشغيل). في هذه الحلقة اللانهائية ، يمكنك استخدامها Compiler evaluate: لتنفيذ المدخلات.

وأنت تقوم بتشغيل هذا في نص مع صورة مقطوعة الرأس.

نصائح أخرى

اعتبارًا من Pharo 2.0 (و 1.3/1.4 مع الإصلاح الموضح أدناه) ، لا يوجد مزيد من الاختراقات اللازمة. سوف يقوم المقتطف التالي بتحويل صورة الفانيليا Pharo إلى خادم Repl ...

من https://gist.github.com/2604215:

"Works out of the box in Pharo 2.0. For prior versions (definitely works in 1.3 and 1.4), first file in https://gist.github.com/2602113"

| command |
[
    command := FileStream stdin nextLine.
    command ~= 'exit' ] whileTrue: [ | result |
        result := Compiler evaluate: command.
        FileStream stdout nextPutAll: result asString; lf ].

Smalltalk snapshot: false andQuit: true.

إذا كنت تريد أن تكون الصورة دائمًا استبدالًا ، فضع الكود في طريقة #StartUp: ؛ خلاف ذلك ، قم بتمرير البرنامج النصي في سطر الأوامر عندما تريد وضع الاستبدال ، مثل:

"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"

المشروع http://www.squeaksource.com/securesqueak.html يتضمن حزمة Repl التي قد توفر الكثير مما تبحث عنه.

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