Wszystkie typy przechowywania obejmują przechowywanie czegoś w jednym punkcie i pobieranie go później. Aby to zrobić tylko w jednej operacji, należy albo automatycznie zapisać lub pobrać, a w drugiej operacji określić pozycję przechowywanej wartości.
Oznacza to, że w przypadku jawnego przechowywania można utworzyć operator, aby pobrać n-tą obliczoną wartość przed tą operacją lub przywrócić bieżącą wartość po n operacjach. Alternatywnie, możesz użyć pozycji bezwzględnej od początku programu lub zrobić więcej rzeczy, takich jak automatyczne usuwanie niektórych elementów po niektórych operacjach (np. Na stosie). Można również utworzyć wielu operatorów, pobierających z różnych kopii magazynu z tymi automatycznymi operacjami lub bez nich. I powinieneś postarać się, aby maksymalna liczba potrzebna do określenia w operacjach była stosunkowo niewielka, abyś mógł przypisać jednego operatora do każdej liczby.
Ale w większości przypadków nawet nie potrzebujesz operatora, a język zrobi to domyślnie. Wtedy trzeba rozważyć bardziej znormalizowany model, taki jak stosy lub kolejki. Najbardziej udanym na razie wydawało się milczące programowanie, w którym nawet nie wspomina się bezpośrednio o pamięci.
Jeśli chcesz zaprojektować nowy taki model, możesz spróbować rozszerzyć oceny jako dag i spróbować pomyśleć o domyślnym dag, jeśli nic innego nie zostanie określone. Najprawdopodobniej domyślnie jest to tylko drzewo, z tym wyjątkiem, że wiele liści może być połączonych z tym samym wejściem. Możesz na przykład użyć kolejki dla zrównoważonego drzewa lub stosu dla głębokiego drzewa, gdzie liście są w większości stałe, lub czegoś w rodzaju Galaretki dla głębokiego drzewa, gdzie liście są w większości kopiami danych wejściowych.
Należy jednak pamiętać, że można zakodować kształt drzewa binarnego za pomocą tylko 2 bitów na operatora. Tak więc, jeśli twój język ma mniej niż 64 operatorów, możesz faktycznie zignorować tradycyjne modele i po prostu zakodować całe drzewo w wolnych bitach (nazwij je flagami replace_parent i below_leaf). Nawet jeśli jest więcej operatorów, możesz zrobić dość dobry domyślny (na przykład model Jelly) i 3 modyfikatory, aby go zmienić.
Możesz użyć tego samego modelu do ukrytego i jawnego przechowywania dla wygody, ale nie musisz. Na przykład możesz użyć stosu do przechowywania niejawnego, ale nie wyskakuj elementów w magazynie jawnym (lub w innym jawnym magazynie oprócz ukrytego). Prawdopodobnie nie będzie nazywany stosem w ostatecznej dokumentacji, ale masz pomysł.
Dla porównania, rozmiar idealnego kodowania drzewa binarnego to logarytm liczb katalońskich . Rozmiar idealnego kodowania „dwójkowego” dag jest logarytmem A082161 , ale oczywiście niepraktycznym. Zakłada się, że operator z inną kolejnością argumentów ma dwa różne operatory, dodając kolejny bit, gdy tak nie jest.
Czasami nadal możesz chcieć zmiennych dla pętli. Może być możliwe przepisanie pętli na inne sposoby. Ale jeśli naprawdę tego potrzebujesz, nie używaj 1-bajtowej konstrukcji oprócz nazwy w celu zdefiniowania zmiennej. chyba że używasz tylko wstępnie zainicjowanych wartości, zwykle bardziej efektywne jest użycie 1-bitowej flagi do określenia, czy odczytujesz, czy zapisujesz tę zmienną.