2017-04-20 4 views
1

Wenn ich Octave öffnen und zu tun:Warum erlaubt Octave das Umbenennen von Funktionen?

a = 1:10; 
sum(a) 

ans = 55 

Aber wenn ich dann tun:

sum = 30; 
sum(a) 

Ich erhalte eine Fehlermeldung:

error: A(I): index out of bounds; value 10 out of bound 1 

Octave mir, wo das Wort zu ändern erlaubt hat, "sum" zeigt also an, es ist ein Wert, keine Funktion. Warum ist das erlaubt und darf ich nicht gewarnt werden - ist das nicht unglaublich gefährlich?

Wie kann ich, wenn mir klar wird, dass ich das getan habe, die Referenz entfernen, ohne die Oktave zu schließen und meinen Arbeitsbereich zu verlieren?

+0

Matlab macht es so ....Du kannst sogar 'min = @max; min ([2 3 4 5]) 'was nun 'ans = 5' ausgibt – Andy

Antwort

2

Stellen Sie sich vor Octave lässt Variablen nicht die gleiche Funktion haben. Sie schreiben ein Programm in Octave und Sie haben eine Variable mit dem Namen total, die keine Funktion ist. Alles ist gut. Eine neue Octave-Version kommt heraus und fügt eine Funktion namens total hinzu. Ihr Programm würde nicht mehr funktionieren und Sie müssten Ihre Variablen umbenennen. Das Niveau der Rückwärtsinkompatibilität wäre schlechter. Und das Problem wäre nicht auf neue Octave-Versionen beschränkt. Vielleicht entscheiden Sie später, dass Sie ein Octave-Paket verwenden möchten, das eine ganze Reihe neuer Funktionen enthält, von denen eine mit Ihren Variablen kollidieren könnte.

In der kommenden Version von Octave geben Fehler außerhalb der Grenzen jedoch einen Hinweis darauf, dass der Variablenname eine Funktion beschattet. In Octave 4.2.1:

octave-cli-4.2.0:1> a = 1:10; 
octave-cli-4.2.0:2> sum = 30; 
octave-cli-4.2.0:3> sum (a) 
error: sum(10): out of bound 1 

Während in 4.3.0+ (die ein Tag 4.4 werden wird):

octave-cli-4.3.0+:1> a = 1:10; 
octave-cli-4.3.0+:2> sum = 30; 
octave-cli-4.3.0+:3> sum(a) 
error: sum(10): out of bound 1 (note: variable 'sum' shadows function) 

jedoch das eigentliche Problem ist nicht, dass Variablen Schatten kann Funktionen. Das eigentliche Problem besteht darin, dass die Syntax es nicht erlaubt, zwischen einer Variablen und einer Funktion zu unterscheiden. Sowohl Variablenindexierung als auch Funktionsaufruf verwendet die gleichen Klammern () (andere Sprachen verwenden normalerweise () für Funktionen und [] für Indexvariablen). Und selbst wenn Sie ohne Argumente eine Funktion aufrufen, die Klammern sind optional:

foo(1) # 1st element of foo? Or is foo a function? 
foo  # Is this a variable or a function call without any arguments? 
foo() # idem 

Diese Syntax hauptsächlich für Matlab Kompatibilität erforderlich ist, die eines der Ziele der GNU Octave ist.

um diesen Mangel zu umgehen, Octave Code-Richtlinien (für Code erforderlich Richtlinien Octave beigetragen Der Octave-Parser kümmert sich nicht wirklich.) Erfordert Funktionen immer Klammern verwenden, um und einen Raum zwischen ihnen und dem Funktionsnamen hat:

foo (x, y); # there is a space after foo so it must be a function 
foo(x, y); # there is no space, it is indexing a matrix 
foo   # this is a variable 
foo();  # this is a function 
+0

Interessante Rationalisierung im 1. Absatz. Interessante Coding Style Info am Ende. Ich verstehe, dass Sie erklären möchten, warum die Fehlermeldung "Index außerhalb der Grenzen" anstelle von "Versuch, etwas aufzurufen keine Funktion" ist. Vielleicht möchten Sie das abwertende Vokabular ("Problem", "Mangel"), das zur Beschreibung der zugrunde liegenden Spracheigenschaft verwendet wird, überdenken. IMO verringert es den Wert Ihrer Antwort. –

+0

Ich denke, ein Octave-Entwickler zu sein gibt mir genug Spielraum, um das Vokabular zu benutzen, das ich will. – carandraug

2

How, if I realise I've done this, do I remove the reference without closing octave and losing my workspace?

Verwenden Sie den Befehl clear sum die Benutzerdefinition von Symbol löschen sum, die sie dem integrierten Bedeutungs zufällt. (Das heißt, die integrierte Definition wird nicht länger von der Benutzerdefinition schattiert.)

Warum Octave auf diese Weise funktioniert, müsste man die Betreuer dieses Open-Source-Projekts fragen. Vielleicht liegt es daran, dass Matlab so arbeitet und Octave bemüht ist, so kompatibel wie möglich zu sein.

Verwandte Themen