2013-02-16 21 views
7

varsayalım benRacket (X) REPL dosyalarının nasıl yüklenir (yeniden)?

#lang racket/base 
(define (hello) (print "Hello")) 
... more definitions ... 

gibi bir dosya var ve etkileşimli (X) repl onlarla çalışmak dosyasındaki tanımları yüklemek istiyorum. Bunu nasıl yaparım? I (X) repl ve (load "/tmp/hello.rkt") başlatırsanız

ardından hello işlev bana hazır değildir:

-> (hello) 
; hello: undefined; 

Ben (require (file "/tmp/hello.rkt")), sonuç aynı ise. Şimdi (enter! (file "/tmp/hello.rkt")) ve daha sonra (hello) çalışabilir, ancak bu oldukça ... sezgisel ve yeni başlayanlar gibi görünmüyor.

Bu gerçekten yapılması gereken bir şey mi? Kodumla kolayca göz atmak ve denemek için sadece modüllere ve ad alanlarına bakmalı mıyım, yoksa daha basit bir bakış açısı mı var?

N.B. How do you load a file into racket via command line?'u buldum, ancak bu yalnızca dosyasının dosyasını nasıl çalıştırdığını açıklar. REPL'ye nasıl yüklenemediğinden, bazı belirli tanımları test edip hata ayıklayabilir, sonra yeniden düzenleyebilir, yeniden yükleyebilirsiniz, vb.

cevap

9

"plt düzeni üst düzey umutsuz" "raket üst düzey umutsuz". (Aslında bir şey yapar, ama muhtemelen size yardımcı olacak bir şey yapmaz.) load'u tamamen kullanmaktan kaçınmak en iyisidir, sadece orada olmadığını farz et.

Şimdi, require'u kullanmak doğru olanıdır, ancak ne yapar, modülü başlatır ve sağladığınız adlara erişmenizi sağlar. Durumunuzda, hello'unuzu kullanamayacağınız anlamına gelen hiçbir şey sağlamadınız. Bunu yapmak için dosyaya (provide hello) ekleyebilirsiniz. Ama muhtemelen istediğin gibi değil, çünkü kod hatalarını ayıklamak istiyorsun. (Yani, sadece şeyler üzerinde çalışmak için modülünden provide şeyi istemeyeceksiniz.)

Yani kullanmak doğru şey enter!, ya da sen xrepl kullanıyorsanız, o zaman daha uygun ,en komut var. Bu, modülü başlatacak ve replinin modülün ad alanını kullanmasını sağlayacak, böylece her şeye erişebilirsiniz. (Ve load veya require'a ihtiyacınız yoktur.) Kodu değiştirdiğinizde tekrar yüklemek için birden çok kez kullanabilirsiniz. Ancak, bununla ilgili bazı sorunların olduğunu unutmayın. Bu nedenle, çalışmak için bir nightly build yüklemeniz gerekebilir.

Son olarak, muhtemelen biliyorsunuzdur, ancak DrRacket ile çalışmak genel olarak işleri çok daha kolaylaştıracaktır.

+0

Tamam, yani 'girin!' (X) REPL'yi kullanmamın sebebi, programımın CLI arayüzü için [charterm] (http://www.neilvandyke.org/racket-charterm/) paketini kullanmam ve bu paketin ' DrRacket'te kullanılmalıdır (bu da anlamlıdır, çünkü DrRacket bir tty sağlamaz). – Confusion

3

Dosyanıza #lang racket/base sokulması dosyayı bir modül formu olarak işaretliyor (bu #lang shorthand); Bu nedenle, dosyayı yüklediğinizde, bu yolu istediğinizde keşfettiğiniz gibi, (file "/tmp/hello.rkt") için bir modül tanımı eklemeniz yeterlidir.

sadece tanımların bir dizi deneme ve etkileşimli yükleyerek denemek istiyorsanız

, dosyanın üstünden #lang racket/base çıkarma deneyebilirsiniz. Yukarıda gösterilen şekilde toplevel başında çalışırken

% cat hello-unhashed.rktl 
(define (hello) (print "Hello") (newline)) 
% cat hello2-unhashed.rktl 
(define (hello) (print "Hello2") (newline)) 
% racket 
Welcome to Racket v5.3.2. 
> (load "hello-unhashed.rktl") 
> (hello) 
"Hello" 
> (load "hello2-unhashed.rktl") 
> (hello) 
"Hello2" 
> (load "hello-unhashed.rktl") 
> (hello) 
"Hello" 
> (exit) 
% 

Not tuzaklar bol olduğunu: Ben "Raket toplevel" (rktl) dosyaları bir çift burada bunu göstermektedir. Ben googling deneyin bahsediyorum dair bir izlenim almak için hiçbir şey eğer load onları yapar, #lang ile başlayan dosyaları modülleri olduğundan veya

+0

Bu Racket geliştiricilerinden biri de "toplevel'in umutsuz" memesinin güzel bir dizinini sağlar: https://gist.github.com/samth/3083053 – pnkfelix

+0

'load' asla tavsiye edilmemelidir. Asla. Tıpkı 'eval' gibi, yararlı bulabilen insanlar, bu konuda sormayacak kadar çok şey bilen insanlardır - bu yüzden sadece bunun hakkında bir şey söylemeniz gerektiğini bilmeniz gerekir ... (Ve BTW, Böyle "toplevel" dosyaları çok farklı olduğu için, '.rktl' onlar için bir sonek olarak kullanıyoruz.) –

+0

ah, '.rktl' sözleşmesi hakkında bilmiyordum. Cevabımı en azından yaptığım dosyalar için kullanacağım. Özgün soru 'load' kullanılarak başlatıldı ve ben bununla devam ettim; Sorgunun, verdiğimiz ikisinin hangi yaklaşımını sorduğuna karar vermesine izin vereceğim. – pnkfelix

İlgili konular