函數檔案(Function Files)

使用函數檔案(Using Function Files)

在撰寫程式時,除了只使用一次的程式之外,通常會需要將自行定義的函數儲存在檔案中,以便日後使用。

使用儲存在檔案中的函數時,可以不需要事先將其載入,當 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 指令時傳入 fieldvalue 參數,可以將 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"
設定使用者的 m 檔案的放置位置,預設為 ~/octave。若更改此設定,必須注意新的位置有在載入路徑中。
"author"
設定新函數的作者欄位內容。
"email"
設定作者欄位內容中的 E-mail。
"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"
設定編輯器開啟的模式,可設定為同步(sync)或非同步(async),若為同步則 Octave 在開啟編輯器之後會一值等待,直到離開編輯器為止,而在非同步的模式,編輯器會在背景執行,不影響 Octave。預設是同步模式。
"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":對於所有的函數都檢查。