#!/bin/bash
#[
  echo Phix ignores all text between #[ and #] in exactly the same way as /* and */ 
  echo (both "and" are nested comments), allowing arbitrary shell code, for example:
  cd /user/project/working
  exec /path/to/phix "$0" "$@"
  exit # may be needed for the shell to ignore the rest of this file.
# comments(/shebang) ignored by Phix end here -> #]
-- aside: few files have [multiline] shebangs like above, but this *is* a test file.
/*  
    Standard
    /*
    **  Nested
    **  /*
    **      Block
    *//*    /*
    **          Comments, of which Phix has quite a few [ok, six] varieties...
    **      */
    *****/
    **/
*/
--/*
    Euphoria-compatibility-style nestable multiline comments/code
--*/
// This program should be runnable (C-style line comments, btw, too!)
with javascript_semantics
string pe, te := iff(platform()==JS?"JavaScript/browser":"Phix/desktop")
ifdef PHIX then 
    pe = "Phix" 
elsedef 
    pe = "Euphoria" -- not that this file is compatible with that..
end ifdef 
printf(1,"This is %s (%s)\n",{pe,te}); -- the ; is entirely optional
assert("\n\r\b\t\\\"\'\0\e"=join({"",10,13,8,9,#5C,#22,#27,#00,#1B},""))
assert("\#42\x43\u4445\U00105678"="B"&'C'&"\xE4\x91\x85\xF4\x85\x99\xB8")

-- triplequote, triplequote indented, backtick, and doublequote strings:
constant tqs = """
this
string\thing""",

tqis = """
_____this
     string\thing""",

bts = `this
string\thing`,

dqs = "this\nstring\\thing"
assert(tqs==tqis and tqis==bts and bts==dqs and dqs==tqs)
assert(x"1 2 34 5678_AbC"=={0x01, 0x02, 0x34, 0x56, 0x78, 0xAB, 0x0C})

-- Beyond comments and strings, not much in Phix bothers a syntax colourer.
-- Originally I had another 380+ lines in here, that didn't prove anything.

function merge_sort(sequence x)
    -- put x into ascending order using a recursive merge sort
     if length(x)<=1 then
         return x  -- trivial case
     end if
     integer midpoint = floor(length(x)/2)
     sequence merged = {},
          first_half = merge_sort(x[1..midpoint]),
         second_half = merge_sort(x[midpoint+1..$])
     -- merge the two sorted halves into one
     while length(first_half)>0 
       and length(second_half)>0 do
         if first_half[1]<=second_half[1] then
             merged = append(merged, first_half[1])
             first_half = first_half[2..$]
         else
             merged = append(merged, second_half[1])
             second_half = second_half[2..$]
         end if
     end while
     -- result is the merged data plus any leftovers
     return merged & first_half & second_half
end function

?merge_sort({9, 10, 3, 1, 4, 5, 8, 7, 6, 2})
?{1,0(2)10,0b11,0d4,0t5,0(6)10,0(7)10,0o10,0x9,#A} -- [the same 1..10 but with extra weirdness]

wait_key()


