在撰寫程式時,除了只使用一次的程式之外,通常會需要將自行定義的函數儲存在檔案中,以便日後使用。
使用儲存在檔案中的函數時,可以不需要事先將其載入,當 Octave 遇到沒有定義的名稱時,會先檢查此名稱是否在已經存在於目前的符號表中,若在符號表中沒有此名稱,則會在載入路徑中尋找主檔名與此名稱相同的 .m
檔案,找到此檔案後會將其自動載入,若此檔案中只有定義一個函數,則此函數會被編譯後執行(若要在一個檔案中定義多個函數,請參考指令稿檔案)。
當 Octave 從檔案中載入函數時,會一並將檔案的名稱與時間戳記(time stamp)記錄下來,若之後檔案的時間戳記有變動,Octave 會自動重新載入,藉由時間戳記的方式,可以讓使用者在執行 Octave 的同時,可以任意更改函數中的內容,存檔後即可在 Octave 中使用,不需要重新啟動 Octave。在以互動式的方式使用 Octave 時,檢查時間戳記的動作只會發生在 Octave 輸出提示符號的時候,而搜尋新的函數定義也只會發生在變更現行目錄的時候。
為了避免 Octave 不斷的重複檢查那些不會更動的函數,而造成執行效率降低,Octave 預設將 octave-home/share/octave/version/m
中的函數都視為固定的函數(這個目錄下的函數都是 Octave 的一些內建函數),凡是放在這個路徑之下的函數,Octave 都會省略檢查時間戳記的動作,以增進效率。
若使用者自行定義的函數也都是固定的,可以使用 ignore_function_time_stamp ("all")
函數設定不檢查所有函數的時間戳記,而使用 "system"
參數可以恢復預設的設定。
edit name edit field value value = edit get field
edit
指令可以編輯指定的函數,或更改編輯器的設定,當呼叫 edit
並傳入一個函數名稱 name
時,會開啟函數編輯器。
若指定的函數 name
位於搜尋的路徑內且可以被編輯,則會將其開啟讓使用者進行編輯;若指定的函數是一個 Octave 內建的函數,則 Octave 會將此函數複製一份到 HOME
目錄,再將其開啟給使用者編輯;若是沒有找到,則 Octave 會嘗試將 name
的結尾加上 .m
或開頭加上 @
後再搜尋,若都沒有則在嘗試同時加上 @
與 .m
。
若 name
是一個在命令列定義的函數,沒有對應的檔案,則 Octave 會自動在 HOME 目錄建立一個 m
檔案,並將目前 name
函數的定義放入此檔案中。
若 name
是一個副檔名為 .cc
的檔案名稱,則會在載入路徑中尋找是否有此一檔案,若有則開啟編輯,否則就會在 HOME
目錄建立一個新的檔案,若其主檔名剛好與一個 m 檔案的主檔名相同,或是與命令列所定義的函數相同,則會將此函數的內容以註解方式加入這個 .cc
檔案中。
若 name
是一個副檔名為 .ext
的檔案名稱,則會在載入路徑中尋找是否有此一檔案,若有此一檔案且可以編輯,則將其開啟編輯,否則就會在 HOME
目錄建立一個新的檔案;若此檔案存在,但不可編輯,則會將此檔案複製一份到 HOME
目錄再開啟編輯。
.cc
檔案,則在使用前必須先以 mkoctfile func_name.cc
指令編譯後,才能使用。若呼叫 edit
指令時傳入 field
與 value
參數,可以將 field
的設定值設為 value
;若傳入的第一個參數為 get
,則會傳回 field
目前的設定,若指定的 field
不存在,則會傳回一個包含所有設定的資料結構,例如:
edit get all
就會傳回所有的設定。以下是所有 edit
可用的設定:
"editor"
EDITOR
所指定的編輯器,其中 %s
是表示檔案的名稱,例如:
'[EDITOR, " %s"]'
:使用在 bug_report
中所使用的編輯器。'"xedit %s &"'
:使用 Unix 中的 xedit
做為編輯器。'"gnudoit -q \"(find-file \\\"%s\\\")\""'
:以目前開啟的 Emacs 做為編輯器(在 .emacs
中必須有 gnuserv-start
)。若在 Cygwin 中指定 Windows 的編輯器,則需要將 Cygwin 的路徑轉為 Windows 的路徑,例如:
'"C:/Program Files/Good Editor/Editor.exe" "$(cygpath -wa %s)"'
"home"
~/octave
。若更改此設定,必須注意新的位置有在載入路徑中。"author"
"email"
"license"
'gpl'
:GNU General Public License(預設)。'bsd'
:BSD-style license without advertising clause。'pd'
:Public domain。'"text"'
:自行定義授權。除了 'pd'
授權之外,edit
會自動加上類似 "Copyright (C) yyyy Function Author"
的版權宣告。
"mode"
"editinplace"
false
。mfilename () mfilename ("fullpath") mfilename ("fullpathext")
mfilename()
函數會傳回目前正在執行的 m 檔案名稱,若加入參數 "fullpath"
,則會傳回完整路徑加上主檔名;若加入參數 "fullpathext"
,則會傳回完整路徑加上主檔名與副檔名,此函數只適用於檔案中,若在做上層的命令列中執行,則會傳回空字串。
val = ignore_function_time_stamp () old_val = ignore_function_time_stamp (new_val)
查詢或設定 Octave 檢查檔案時間戳記的規則,每當 Octave 在尋找定義在檔案中的函數之前,會依照此規則決定是否要檢查檔案的時間戳記,在檢查時間戳記時若發現時間戳記有更動,則會自訂重新載入檔案內容。以下是可用的選項:
"system"
:對於 octave-home/lib/version
目錄下面的所有檔案都不會檢查其時間戳記,但其他蒐尋路徑中的檔案則會檢查。"all"
:對於所有的函數都不檢查,除非使用 clear
將函數整個移除後重新載入。"none"
:對於所有的函數都檢查。