2010-06-18 23 views
25

Tôi có thể khởi chạy Squeak dưới dạng REPL (không có GUI), nơi tôi có thể nhập và đánh giá các biểu thức Smalltalk không? Tôi biết hình ảnh mặc định không cho phép điều này. Có tài liệu nào về cách xây dựng một hình ảnh tối thiểu có thể được truy cập từ một shell dòng lệnh không?Sử dụng Squeak từ một vỏ

Trả lời

12

Đây là một (hackish) giải pháp: Trước tiên, bạn cần OSProcess, vì vậy hãy chạy này trong Workspace:

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

Tiếp theo, đặt điều này trong các tập tin 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) 

Và cuối cùng, hãy chạy lệnh này:

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

Bây giờ bạn có thể vui chơi với một REPL Smalltalk. Đừng quên nhập vào lệnh:

Smalltalk snapshot:true andQuit:true 

nếu bạn muốn lưu các thay đổi của mình.

Bây giờ, vào phần giải thích của giải pháp này: OSProcess là gói cho phép chạy các quy trình khác, đọc từ stdin và ghi vào stdout và stderr. Bạn có thể truy cập stdout AttachableFileStream với OSProcess thisOSProcess (quá trình hiện tại, còn gọi là squeak).

Tiếp theo, bạn chạy vòng lặp vô hạn tại userBackgroundPriority (để cho phép các tiến trình khác chạy). Trong vòng lặp vô hạn này, bạn sử dụng Compiler evaluate: để thực thi đầu vào.

Và bạn chạy điều này trong một tập lệnh có hình ảnh không có đầu.

7
+0

Điều này không thực sự trả lời câu hỏi. Liên kết đầu tiên về cơ bản không liên quan đến câu hỏi. Thứ hai là một câu hỏi về hoạt động của máy chủ. Nhưng câu hỏi này, như tôi hiểu nó, là về việc chạy Squeak như 'irb' hay' python' để nó tương tác với thiết bị đầu cuối trên stdin và stdout. –

0

Dự án http://www.squeaksource.com/SecureSqueak.html bao gồm một gói REPL có thể cung cấp phần lớn những gì bạn đang tìm kiếm.

+0

Oh và liên kết đầu tiên trong phản ứng của Friedrich bao gồm tham chiếu đến ExternalCommandShell có vẻ như nó cung cấp chức năng tương tự. –

+0

Bạn có thể tìm thêm thông tin về REPLServer từ SecureSqueak tại http://gulik.pbworks.com/w/page/7760030/REPLServer. –

7

Do Pharo 2.0 (và 1.3/1.4 với bản sửa lỗi được mô tả bên dưới), không cần thêm hacks nữa. Đoạn sau đây sẽ lần lượt vani Pharo hình ảnh của bạn thành một máy chủ REPL ...

Từ 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. 

Nếu bạn muốn hình ảnh luôn là một REPL, đặt mã trong một #startup: Phương pháp ; nếu không, hãy chuyển tập lệnh tại dòng lệnh khi bạn muốn chế độ REPL, như:

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