2010-04-06 54 views
2

如何調用以下屬性的語言構造?語言構造命名:功能/轉到

  • 它有開始和結束,就像一個功能
  • 它包含它的名字,也很喜歡的功能,但沒有參數的頭
  • 可以有任意數量的開始之間的語句和結尾,一樣的功能

  • 您可以使用函數從任何地方(甚至本身)跳到它的開始,直到它到達其最終將執行它包含的語句

  • 你可以使用一個函數立即停止其內容的執行並跳回它被調用的地方

  • 它包含的代碼和其他所有的代碼都在同一個範圍內,所以你可以訪問外部的所有變量並創建新的,離開構建時不會被刪除。

總而言之,這就像一個goto點與結束並返回了它是從所謂的選項。

+0

這功課嗎? – falstro 2010-04-06 10:16:58

+0

這不是我的家庭作業,即使是這樣,爲什麼這是你的生意? :) – sub 2010-04-06 10:21:16

+1

@sub:http://meta.stackexchange.com/questions/10811/homework-on-stackoverflow – kennytm 2010-04-06 10:30:51

回答

2

BASIC有這個,它被稱爲gosub和它唯一的優勢超過適當的功能是你最後一點,其中所有的變量都在相同的範圍內。除此之外,它吸了。

在面向對象的語言中,通過將所需的變量封裝到對象中並使不同的方法互相調用,可以實現相同的效果。多個入口點不是大多數語言的特徵,但您可以通過將您的方法拆分爲更小的塊來解決這個問題。

+0

謝謝,我現在仔細看看BASIC的gosub,它看起來就像我在這裏尋找的東西。我想這會是一個子程序。 – sub 2010-04-06 10:38:44

+0

@sub您可能對Python和C#的生成器感興趣。 – 2010-04-06 10:39:14

-1

從程序的結構來看,我會稱之爲腳本。例如。一個shell /批處理腳本。

也許任務對於那種結構來說是一個更好的名字,它可以是一個使用JavaScript或Perl的腳本,它可以通過引用腳本本身來執行。

+0

什麼?用腳本語言編寫的程序不是一個腳本嗎? – sub 2010-04-06 10:37:49

+0

當然,shell腳本就像一個可以通過自身(遞歸)或其他腳本(函數)調用的命令,通過禁止參數使得構造難以在實踐中使用。這種限制可能會通過使用全局變量來規避,但這會導致代碼非常難以維護。 – Ernelli 2010-04-06 10:43:51

1

closure的概念可能是相關的。

閉包是一個函數,但它在某個範圍(另一個函數,比方說)中定義,並且它可以訪問該範圍內的所有變量。所以它擁有你列出的大部分屬性,除了在標題中聲明(通常)名稱外。在任何情況下,標題都是語言實現細節,而不是像這樣的特徵:-)。通常,閉包可以從它們定義的函數中返回,並且在GC語言中,它們將保持對它們使用的局部變量的引用。

還要考慮Perl有兩種​​不同的作用域變量 - 詞法變量(「my」)和動態變量(「local」)。詞彙變量是您習慣於C,Java等的當地人。從聲明它們的塊中調用的任何函數都可以看到動態變量。因此,如果所有變量都以local聲明,那麼所有的Perl函數都具有所需的屬性。

在所有情況下,我錯過了「創建在離開函數時未被破壞的新變量」。這很少見,因爲它假定在函數中聲明的變量具有全局範圍,在大多數語言中這不是典型情況。你通常可以通過擁有一些全局對象和掛起的東西來僞造它,但它很少有用。

0

由於問題被標記爲「與語言無關」,我想補充構造subroutines與構造procedures是同義的。

有一些語言相關的細微差別procedures例如SQL執行:

  • 自己被孤立範圍(使其不亂,無辜的被站立的變量);
  • 它有一個可選參數列表IN,OUTINOUT參數;
  • 它不是return什麼,只是改變了參數OUTINOUT的值;

@Steve Jessop Closures是我書中一種非常不同的怪物。

雖然他們確實模仿procedure的許多特點,他們有自己的參數列表和調用堆棧,這使得它們的功能能夠訪問外部範圍,而不是一個procedure/subroutine