2012-02-19 6 views
6

This page z ręcznymi Factor mówi o tych typach stosy zapisanych w kontynuacji:callstack? retainstack? namestack?

  • datastack
  • retainstack
  • callstack
  • namestack
  • catchstack

Co dokładnie zrobić te stosy się trzymają? Trzy najbardziej kłopotliwe dla mnie są stacje wywoławcze, retainstack i namestack.

+0

Co za zabawny język! +1 – Irfy

Odpowiedz

8

jestem na pewno nie czynnikiem guru, ale ponieważ ich nazwy wydają się sugerować ich zastosowanie:

  • datastack: używany do pchania i zwykle pojawiały wartości. 3 4 + używa opakowania danych do wypchnięcia "3", a następnie naciśnij "4". Uruchamianie "+" przesyła 2 wartości ze zbioru danych i przesyła odpowiedź, 5, z powrotem do zbioru danych. Uruchamianie interaktywną sesję czynnik (przynajmniej na Linuksie) drukuje zawartość stosu po każdej interakcji:

    $> 1 
    --- Data stack: 
    1 
    $> 2 
    --- Data stack: 
    1 
    2 
    $> + 
    --- Data stack: 
    3 
    $> . 
    3 
    $> 
    
  • callstack: używane żeby zapisywać, które słowa są uruchomione i ich indywidualne postępy, podczas gdy ich składowe słowa wykonać . Wyobraź sobie, że zdefiniowałeś lepszą wersję sumy: : sum' (seq-of-int -- summmation) 0 [ + ] reduce 20 + ; (lepiej, bo dostaniesz dodatkowe 20 za darmo!). Chcąc ponownie użyć kodu, użyłeś słowa reduce, które pochodzi od standardowego współczynnika. Chociaż środowisko wykonawcze wykonuje sum', wywołuje implementację reduce. Ale ponieważ wciąż musimy dodać dodatkowe 20, ktoś musi zarejestrować miejsce rozpoczęcia, gdy tylko powróci reduce. Te notatki są przechowywane na statywie, najprawdopodobniej z pewnymi pomocniczymi danymi podczas przebiegu debugowania, aby pomóc debuggerom zrozumieć, co się dzieje.

  • retainstack: służy do zachowania wartości w sortowanym pomocniczym zestawie danych. W Forth można nadużywać stosu powrotnego (analog Fortha do stwora), aby działał jak stój retainstack. Jednym z problemów związanych z tym podejściem jest to, że wracając z twojego słowa bez sprzątania brudnego hacka, przeskoczysz do niewłaściwych lokalizacji i dokonasz ogólnego spustoszenia. Środowisko wykonawcze Forth zobaczy twoje wartości, spodziewając się, że będą to ładne notatki, które wywołają podczas wywoływania słowa i będą zdezorientowane. Używając osobnego stosu dla adresów zwrotnych, czynnik może tego uniknąć.

  • Namestack: używany do przechowywania danych niezbędnych do wdrożenia dynamic variables. Korzystając ze stosu, można ukryć stare nazwy za pomocą nowych podczas wykonywania podprogramu, a następnie wywołać powiązanie i stare nazwy zostaną przywrócone.

  • catchstack: używany do obsługi obsługi wyjątków. Za pomocą stosu podprogramy mogą rejestrować własne programy obsługi wyjątków i domyślne zachowanie cienia. Następnie, gdy słowo wróci, stare procedury obsługi mogą być łatwo przywrócone poprzez wyskakiwanie ze stosu.

Powiązane problemy