madmats%elcgl.epfl.ch@VMA.CC.CMU.EDU (Mats Weber) (03/20/90)
----------------- cut here (non inclusive) ------------------------ with Text_IO; procedure Write_Itself is First_Part_Length : constant := 39; Second_Part_Length : constant := 34; Number_Of_Lines : constant := 2 * (First_Part_Length + Second_Part_Length); Max_Columns : constant := 80; Null_Character : constant Character := ASCII.Nul; subtype String_Max_Columns is String(1..Max_Columns); Image : array (1..Number_Of_Lines) of String_Max_Columns; function Pad (The_String : String) return String_Max_Columns is begin return The_String & (1..Max_Columns - The_String'Length => Null_Character); end Pad; function Unpad (The_String : String) return String is begin for I in The_String'Range loop if The_String(I) = Null_Character then return The_String(The_String'First..I - 1); end if; end loop; end Unpad; begin Image(1..First_Part_Length + Second_Part_Length) := ( Pad("with Text_IO;"), Pad(""), Pad("procedure Write_Itself is"), Pad(""), Pad(" First_Part_Length : constant := 39;"), Pad(" Second_Part_Length : constant := 34;"), Pad(" Number_Of_Lines : constant :="), Pad(" 2 * (First_Part_Length +"), Pad(" Second_Part_Length);"), Pad(""), Pad(" Max_Columns : constant := 80;"), Pad(""), Pad(" Null_Character : constant Character := ASCII.Nul;"), Pad(""), Pad(" subtype String_Max_Columns is String(1..Max_Columns);"), Pad(""), Pad(" Image : array (1..Number_Of_Lines) of String_Max_Columns;"), Pad(""), Pad(""), Pad(" function Pad (The_String : String)"), Pad(" return String_Max_Columns is"), Pad(" begin"), Pad(" return The_String &"), Pad(" (1..Max_Columns - The_String'Length =>"), Pad(" Null_Character);"), Pad(" end Pad;"), Pad(""), Pad(" function Unpad (The_String : String) return String is"), Pad(" begin"), Pad(" for I in The_String'Range loop"), Pad(" if The_String(I) = Null_Character then"), Pad(" return The_String(The_String'First..I - 1);"), Pad(" end if;"), Pad(" end loop;"), Pad(" end Unpad;"), Pad(""), Pad("begin"), Pad(" Image(1..First_Part_Length + Second_Part_Length) :="), Pad(" ("), Pad(" );"), Pad(" Image(Number_Of_Lines - Second_Part_Length + 1.."), Pad(" Number_Of_Lines) :="), Pad(" Image(First_Part_Length + 1.."), Pad(" First_Part_Length + Second_Part_Length);"), Pad(" for I in Positive range"), Pad(" First_Part_Length + 1.."), Pad(" Number_Of_Lines - Second_Part_Length"), Pad(" loop"), Pad(" declare"), Pad(""), Pad(" Padded_Image : constant String :="), Pad(" (1..9 => ' ') &"), Pad(" ('P', 'a', 'd', '(', ASCII.Quotation) &"), Pad(" Unpad(Image((I - First_Part_Length) *"), Pad(" Boolean'Pos(I - First_Part_Length <="), Pad(" First_Part_Length) +"), Pad(" (I + Second_Part_Length) *"), Pad(" Boolean'Pos(I - First_Part_Length >"), Pad(" First_Part_Length))) &"), Pad(" (ASCII.Quotation & ')');"), Pad(""), Pad(" begin"), Pad(" if I < Number_Of_Lines - Second_Part_Length then"), Pad(" Image(I) := Pad(Padded_Image & ',');"), Pad(" else"), Pad(" Image(I) := Pad(Padded_Image);"), Pad(" end if;"), Pad(" end;"), Pad(" end loop;"), Pad(" for I in Image'Range loop"), Pad(" Text_IO.Put_Line(Unpad(Image(I)));"), Pad(" end loop;"), Pad("end Write_Itself;") ); Image(Number_Of_Lines - Second_Part_Length + 1.. Number_Of_Lines) := Image(First_Part_Length + 1.. First_Part_Length + Second_Part_Length); for I in Positive range First_Part_Length + 1.. Number_Of_Lines - Second_Part_Length loop declare Padded_Image : constant String := (1..9 => ' ') & ('P', 'a', 'd', '(', ASCII.Quotation) & Unpad(Image((I - First_Part_Length) * Boolean'Pos(I - First_Part_Length <= First_Part_Length) + (I + Second_Part_Length) * Boolean'Pos(I - First_Part_Length > First_Part_Length))) & (ASCII.Quotation & ')'); begin if I < Number_Of_Lines - Second_Part_Length then Image(I) := Pad(Padded_Image & ','); else Image(I) := Pad(Padded_Image); end if; end; end loop; for I in Image'Range loop Text_IO.Put_Line(Unpad(Image(I))); end loop; end Write_Itself; ----------------- cut here (non inclusive) ------------------------
jamesth@microsoft.UUCP (James THIELE) (03/22/90)
In article <900319200431.23c00532@SIC.Epfl.CH> madmats%elcgl.epfl.ch@VMA.CC.CMU.EDU (Mats Weber) writes: >----------------- cut here (non inclusive) ------------------------ >[146 lines of Ada code deleted] >----------------- cut here (non inclusive) ------------------------ I've seen *much* shorter self-reproducing programs in FORTRAN. Does this mean FORTRAN is more sophisticated than Ada? James Thiele -- Standard Disclaimer
sbw@naucse.UUCP (Steve Wampler) (03/22/90)
From article <53671@microsoft.UUCP>, by jamesth@microsoft.UUCP (James THIELE): > In article <900319200431.23c00532@SIC.Epfl.CH> madmats%elcgl.epfl.ch@VMA.CC.CMU.EDU (Mats Weber) writes: >>[146 lines of Ada code deleted] > I've seen *much* shorter self-reproducing programs in FORTRAN. > > Does this mean FORTRAN is more sophisticated than Ada? Actually, since you can fit the self-replicating programs for a lot of languages simultaneously (i.e. join them together) in the space of this one Ada program, maybe this means that Ada is all these other languages rolled into one? Now I know why I like Icon so much. -- Steve Wampler {....!arizona!naucse!sbw} {sbw@naucse.cse.nau.edu}