我一直在努力解決這個小問題一段時間。我試圖創建我自己的內部JSON結構的實現。面臨的挑戰是,對於Ada,我必須使用訪問類型來遞歸,如果我沒有嚴格控制,訪問類型有泄漏的風險。爲了控制它,我將所有真正的活動保留爲私有,我爲節點類型提供了Get (Source:...)
和Set (Target:...; Value:...)
函數/過程,它們將嘗試驗證和處理任何現有的Vector(json-array)或Map(json-object)元素。爲了進一步確保我使用Ada 2012的穩定功能,並在內容超出範圍時捕獲內容,我嘗試使用Protected_Controlled類型和「管理」Ada庫,但發現容器庫無法處理受保護的類型,所以我只用了Controlled。 Finalize (...)
過程適用於任何Vector或Map類型,並遞歸釋放Node_Value.Reference。在Ada中,我如何遞歸映射和內存管理自己的類型
我的問題是如果我正確應用Ada 2012,或者如何創建一個可以是矢量/地圖或字符串/數字的內存管理遞歸?
private
...
type Node_Access is access Node;
type Node_Value is new Ada.Finalization.Controlled with record
Reference : Node_Access;
end record;
overriding procedure Initialize (Item : in out Node_Value);
overriding procedure Adjust (Item : in out Node_Value);
overriding procedure Finalize (Item : in out Node_Value);
...
package Of_Array is new Ada.Containers.Indefinite_Vectors (Natural, Node_Value);
package Of_Object is new Ada.Containers.Indefinite_Ordered_Maps (Wide_String, Node_Value);
type Node is record
...
Vector : aliased Of_Array.Vector;
Object : aliased Of_Object.Map;
end record
with Size => 96;
procedure Free is new Ada.Unchecked_Deallocation (Node, Node_Access);
你看過['GNATCOLL.JSON'](https://docs.adacore.com/gnatcoll-docs/json.html)嗎? – trashgod
如果判別式有默認值,你的節點[可以是可變的](https://en.wikibooks.org/wiki/Ada_Programming/Types/record#Mutable- and_immutable_variant_records) –
@trashgod Thankyou,但正如任何_serious_ beginner I我希望能夠變得足夠好,我不必依賴GPL庫。我喜歡GCC修改的GPL,LGPL和其他各種。我更喜歡這種方式發佈我自己的代碼。我已經分析了情況,對我來說,GPL許可證問題太複雜了,有點像軟件專利,它往往會減緩實際進展。無論如何,這是_my_嘗試使JSON儘可能接近原生Ada的風格和功能。感謝大家的幫助! (特別是你西蒙賴特) –