OCaml ist in der Tat eine eifrige Sprache, aber s
ist ein perfekt gültiger und vollständig ausgewerteter Begriff, der zufällig einen Zyklus enthält. Zum Beispiel ergibt dieser Code das erwartete Ergebnis:
let f (Self Self x) = x
f s == s;;
genauer gesagt, der Speicherdarstellung von Konstrukteuren mit zumin n Argumente sind eingerahmt und wie folgt lauten:
⋅—————————————————————————————————————————————⋅
| header | field[0] | field[1] | ⋯ | fiekd[n] |
⋅—————————————————————————————————————————————⋅
Der Header enthält Metadaten während field[k]
ist ein OCaml-Wert, dh entweder eine Ganzzahl oder ein Zeiger. Im Fall von s
hat Self
nur ein Argument und damit nur ein Feld field[0]
. Der Wert von field[0]
ist dann einfach ein Zeiger auf den Anfang des Blocks. Der Begriff s
ist somit in OCaml perfekt darstellbar.
Darüber hinaus kann der Toplevel-Drucker diese Art von Zyklen erkennen und ein <cycle>
drucken, um zu vermeiden, in eine unendliche Rekursion zu fallen, wenn der Wert von gedruckt wird. Hier stellt <cycle>
, wie <abstr>
oder <fun>
, nur eine Art von Wert dar, den der Toplevel-Drucker nicht drucken kann.
Beachten Sie jedoch, wird dieser zyklische Wert unendliche Rekursion in vielen Situationen auslösen, zum Beispiel f s = s
wo (=)
die strukturelle Gleichheit ist und nicht die physischen (i.e. (==))
löst solche Rekursion, wäre ein weiteres Beispiel seine
let rec ones = 1 :: ones;; (* prints [1;<cycle>] *)
let twos = List.map ((+) 1) ones;; (* falls in an infinite recursion *)
Das Drucken von ist nur eine Eigenschaft des Toplevel-Druckers, der in 4.02 tatsächlich eingeführt wurde (vgl. Https://caml.inria.fr/mantis/view.php?id=6228). Jedoch können zyklische Werte seit OCaml 1.0 definiert werden (siehe http://caml.inria.fr/pub/docs/manual-ocaml-4.04/extn.html#sec217); Dennoch ist es möglich, dass Try Ocaml mit solchen Werten Schwierigkeiten hat. –
octachron