2010-11-24 13 views
7

Bazen aşağıdaki Senaryo girmek çatışan - Bir prosedür bazı hesaplama yapmak için küresel işlevini f[x] kullanır, bu arada başka prosedür Ben yerelleştirme hakkında bilmek 5[x]Tespit DownValue/OwnValue

içine sonraki tüm aramalar f[x] döner f=5 yapar değişkenler, ancak global değişkenleri gelişimin erken dönemlerinde kullanmayı tercih ediyorum.

OwnValues ​​ve DownValues'ı karıştırmanın meşru bir sebebini düşünemiyorum. Yukarıdaki gibi bir durum olduğunda bir uyarı mesajı uygulamak için bir yolu var mı?

aşağıda ipuçlarına ek olarak, varsayılan bağlam Hücre Seçenekleri altında OptionsInspector bulunabilir/Değerlendirme Seçenekler/CellContext

cevap

11

Sen (her türlü) başka düzenlemeleri önlemek için Protect[f] kullanabilir ve Unprotect[f] onları tekrar izin vermek.

Ayrıca aslında f üzerinde kendi-değerlerini koyarak ancak yine de kullanımı Protect/Unprotect kalmadan aşağı değerlerin atama izin dan Set[f, ...] önlemek için yukarı-değerleri ile bazı basit hackery yapabilirdi:

In[76]:= ClearAll[f] 

In[77]:= f /: Set[f, x_] := x 

In[78]:= f = 7 

Out[78]= 7 

In[79]:= f 

Out[79]= f 

In[80]:= f[x_] := x + 1 

In[81]:= f[1] 

Out[81]= 2 

Yukarıdaki, f numaralı telefondan Set'un kullanımını şeffaf bir şekilde engeller.

In[93]:= f::noov = "Blocked attempt to assign `1` as an OwnValue of f"; 

In[94]:= f /: Set[f, x_] := (Message[f::noov, x]; x) 

In[95]:= f = 7 

During evaluation of In[95]:= f::noov: Blocked attempt to assign 7 as 
    an OwnValue of f 

Out[95]= 7 
+0

DownValue/OwnValue çakışması varsa, Set/SetDelayed'i uyarı iletisi yazdırmaya zorlamak hakkında ne düşünüyorsunuz? –

+1

Muhtemelen mümkün, ama muhtemelen kırılgan. Bunun yerine bağlamları kullanmayı mı düşündünüz ('Begin' /' End') ya da hücre/notebook düzeyi bağlamları mı ayarlıyorsunuz? –

+0

+1, Böyle yukarı değerlerini kullanmayı düşünmemiştim. Zeki. Ek olarak, hücre/dizüstü bilgisayar düzeyi bağlamları hakkında iyi bir nokta yaparsınız; 5. 5 – rcollyer

3

Bu bir uyarı mesajı üretme konusunda özgün soruya cevap vermez, ama küresel semboller olarak kullanım için kullanışlı Formal Symbols şunlardır: gerçek bir mesaj Düzenleyen çok basittir. Otomatik olarak korunurlar ve bu nedenle yanlışlıkla yeniden tanımlanamazlar. f tuşlarının herhangi bir harf olabileceği <ESC>$f</ESC> tuş vuruşlarını kullanarak resmi bir sembol girersiniz. Dezavantajı, sembol yerine bir tane girmek için dört tuş vuruşu almasıdır.

+0

+1. Çift vuruşlu ya da Yunanca harflerden programlı olarak (paket içinde) resmi semboller üretmek mümkün mü? Değilse, Formal Semboller belgesindeki MakeBoxes örneklerinin ikame edilmesine (karakter ve/veya renge) izin vereceğini varsayalım. Bu gerçekten kullanışlı bir tasarım numarası olabilir. :) – telefunkenvf14

+0

@ telefunkenvf14 Eğer resmi sembollerin ayırt edici görsel görünümüne (yukarıda ve aşağıda bulunan noktalarda) atıfta bulunursanız, başka semboller üretmenin bir yolunu bilmiyorum. Anlayabildiğim kadarıyla, noktalı harfler özel bir yazı tipinde karakterlerdir. Muhtemelen 'Underoverscript' ve' Symbolize' kullanarak yakın olabilir, ancak sonuçlar klavyeden girmek için bir güçlük olabilir. Resmi simgelerin diğer özellikleri, yerleşik tanımlara sahip olmadıkları ve 'Koruma 'ile güvenceye alındıklarının, diğer herhangi bir sembol için ayarlanması kolaydır. – WReach