2010-11-01 19 views
10

bütün plak tanım başlıklarını okuyabilir , Örneğin, nasıl otomatik Bu soru olarak başladı

Ya benzer. Şu anda bir Erlang kabuğunu her başlattığımda yazmak zorundayım ve bundan yoruldum ve her zaman unutuyorum.

Ama bu aslında bu yanlış soru oldu! Aslında yapmak istediğim şey, her kabuk işinde kayıt tanımlama başlıklarımı okumak. Başlangıçta çalıştırılacak kabuk yerleşik komutlarının diğerlerinde kullanılmaz. Soruyu nasıl sorması gerektiğini sorgulamak için soru başlığını değiştirdim.

cevap

13

Belirli rr/1 kullanımı için bir çözüm tökezledi

okuma ve baskı için bazı destek var kabuktaki kayıtları. Derleme kaydı ifadeleri, tuple expres- siyonlarına çevrilir. Çalışma zamanında, bir tuple aslında bir kayıt temsil eder. Derleyici tarafından çalışma zamanında kullanılabilen kayıt tanımları da yoktur. Bu nedenle, kayıt sözdizimini okumak ve mümkünse kayıtlarını yazdırmak için, kayıt tanımlarının kabuğunun kendisi tarafından korunması gerekir. Okuma, tanımlama, unutma, listeleme ve yazdırma kayıtları için kabuk komutları aşağıda açıklanmıştır. Her bir işin 'un kendi kayıt tanımları kümesine sahip olduğunu unutmayın. Konularda kolaylaştırmak için shell_default modüllerinde tanımlarını kaydedin ve user_default (yüklüyse) , yeni bir iş başlatıldığında okunur. Örneğin, user_default için

-include_lib("kernel/include/file.hrl"). 

kabuk içinde hazır file_info tanımını yapar hattı ekleyin.

Dosya foo.hrl:: açıklama için

bazı örnek eklemek

Dosya
-record(foo, {bar, baz=5}). 

:

$ erl 
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.7.5 (abort with ^G) 
1> #foo{}. 
#foo{bar = undefined,baz = 5} 
:

-module(user_default). 
-compile(export_all). 

-include("foo.hrl"). % include all relevant record definition headers here 

%% more stuff probably ... 

kabuğunda denemek sağlar:

→ kabuk foo.hrl

0

Ev dizininize .erlang adlı dosyaya yerleştirin (bkz. Paragraf 1.7.1, http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html). Kabuk Adam-sayfasından

: .erlang ile çözüm çalışırken

+0

rr() örneği için bu işi yapmakta zorlanıyorum. Biri için sadece yukarıda belirtildiği gibi .erlang'da belirtmek gerekirse rr/1'i bulamıyor ve rr/1 modülünün hangi modülde tanımlandığını bilmiyorum. Öte yandan bunun müsait olacağından emin değilim. tüm kabuk işlerinde. –

+1

@Peer Stritzinger: 'rr()' bir işlev olarak tanımlanmamıştır; "local_func/7" işlevinin bir tümcesi olarak stdlib/shell.erl dosyasında bulabilirsiniz. – Zed

+0

@Zed: evet bu benim sorunumdu ve ben de otomatik olarak aramanın bir yolunu arıyordum. Kendi çözümümdeki geçici çözümü bağışla ve başlangıçta ihtiyaç duyulan gömme yerleşik işlevlerin herhangi birisini düşünemediğimden, sorun benim için geçici çözüm tarafından çözülüyor. –

2

dosya .erlang kabuk başlatıldığında değerlendirilir gelen plağını bilmiyor ama kabuk bağlamında değerlendirilen DEĞİL olduğunu.Bu, yalnızca kabuk komutları değil, değerlendirilen genel ifadeleri içerebileceği anlamına gelir. Ne yazık ki rr() bir kabuk komutudur (kayıtları tanımak için yerel kabuk verilerini başlatır), böylece .erlang dosyasında kullanılamaz.

önceden yüklenmiş olması gerekir kullanıcı tanımlı modül user_default, -include veya -include_lib kullanarak kayıt tanımlarını içeren dosyalar içerebilir olsa da, bu rekor tanımları sonra sadece user_default içinde tanımlanmış fonksiyonlar için hazır olacaktır. user_default normal derlenmiş modüldür ve dışa aktarılan işlevler diğer işlevler olarak adlandırılır, böylece kayıt tanımları kabuk içinde görünmeyecektir. user_default, kullanıcının kabuk içinde kabuk komutları olarak adlandırılabilecek daha karmaşık işlevleri tanımlamasına izin verir.

DÜZENLEME:

Burada kısmen yanlış oldu. .erlang'un nasıl değerlendirildiğini ve user_default işlevlerinin nasıl çağrıldığı konusunda haklı olduğum halde, user_default.erl kabuğunda, daha sonra kabuk içinde kullanılabilen kayıt tanımları için kabuk başlangıcında nasıl taranmadığını özledim. Teşekkürler @Peer Stritzinger bunu işaret ediyor.

+0

Emin misin? Manpage'ten gelen metin aksini söylüyor. Kontrol etmek için küçük bir test vakası kurdum (bkz. Http://ideone.com/4Gau5) Göründüğü gibi işe yarayacak gibi görünüyor. Bir şey mi eksik? –

+0

Hayır, hiçbir şey kaçırmadın. Kodu kontrol ediyordum ve sadece 'shell_default' ve 'user_default' işlevlerini kullandığını gördüm ve kabuk açılışında yapılan taramaları kaçırdım. Mea Culpa. – rvirding

İlgili konular