]]> ]]>

Clarion

Диалект языка программирования Clarion

Первая версия Клариона под Windows вышла январе 1995 года. Известные версии: CW 1.0 (1995) CW 1.5 (1995) CW 2.0 (1996) — наряду с 16-битными приложениями стало возможно создавать 32-битные. Начиная с этой версии, язык был расширен для поддержки ООП. Добавлена поддержка ActiveX и поддержка SQL. CW 4.0 (1997) — появление новых ООП шаблонов генерации кода ABC. C5 (1998) C5.5 (2000) C6 (2003) C6.3 (2006) — только 32-битные приложения (поддержка 16-битных приложений исключена) C7 (2009) — полностью обновлённая среда IDE C8 (2011) C9 (2014) C10 (2015) — поддержка .NET 4

Примеры:

Hello, World!:

Пример для версий Clarion C7
   PROGRAM
     MAP
     END
   CODE
     MESSAGE('Hello World!','Clarion')
     RETURN

CamelCase:

Пример для версий Clarion C7
  PROGRAM

  MAP
  END

InitStr              STRING('Some string with any symbols')
Str                  CSTRING(100),AUTO
symbol               STRING(1)

   CODE
      j# = 1 ! implicit variable
      loop i# = 1 to len(InitStr) by 1
         symbol = lower(InitStr[i#]) ! string can be considered as array
         case symbol
         of 'a' to 'z'
            Str[j#] = choose(was_letter#,symbol,upper(symbol))
            j# += 1 ! using of add equals operator for increment
            was_letter# = TRUE
         else 
            was_letter# = FALSE
         end   
      end   
      message(Str,'CamelCase')

Квадратное уравнение:

Пример для версий Clarion C7

минималистическая версия

   PROGRAM

OMIT('***')
 * User: Shur
 * Date: 28.02.2016
 * Time: 14:05
 ***
  MAP
  END

A REAL
B REAL
C REAL

root               CSTRING(64)

   CODE
      
      A=0; B=2; C=3
      !A=1; B=-5; C=3
      !A=1; B=2; C=1
      
      D$ = B * B - 4 * A * C
      if A = 0
         root = 'Not a quadratic equation.'
      elsif D$ = 0
         root = 'x = ' & -B/2/A
      elsif D$ > 0 then
         root = 'x1 = ' & (-B-sqrt(D$))/2/A & '|' & |
                  'x2 = ' & (-B+sqrt(D$))/2/A
      else   
         root = 'x1 = (' & -B/2/A & ', ' &  sqrt(-D$)/2/A & ')' & '|' & | 
                  'x2 = (' & -B/2/A & ', ' & -sqrt(-D$)/2/A & ')'
      end
      message(choose(A=0,'','D='&D$&'|----------|')&root,'Quadratic equation')

Квадратное уравнение:

Пример для версий Clarion C7

максималистичная версия с проверкой найденных корней. попутно реализована арифметика комплексных чисел

   PROGRAM

OMIT('***')
 * User: Shur
 * Date: 28.02.2016
 * Time: 14:05
 ***
complex          GROUP,TYPE
a                       REAL(0)
b                       REAL(0)
                 END

  MAP
cxSum             PROCEDURE(*complex cxA, *complex cxB, *complex cxRes)
cxMul             PROCEDURE(*complex cxA, *complex cxB, *complex cxRes)
cxDiv             PROCEDURE(*complex cxA, *complex cxB, *complex cxRes)
  END

A REAL
B REAL
C REAL

X                   GROUP,PRE(X),DIM(2)
X                       LIKE(complex)
F                       CSTRING(64)
R                       LIKE(complex)
                     END

root               CSTRING(64)
check_               CSTRING(256)

CX1                   LIKE(complex)
CX2                   LIKE(complex)
CX3                   LIKE(complex)

   CODE
      A=1; B=3; C=3
      !A=1; B=-5; C=3
      !A=1; B=2; C=1
      D$ = B * B - 4 * A * C
      if A = 0
         root = 'Not a quadratic equation.'
      elsif D$ = 0
         X[1].X.a = -B/2/A
         root = 'x = ' & X[1].X.a
      elsif D$ > 0 then
         X[1].X.a = (-B-sqrt(D$))/2/A         
         X[2].X.a = (-B+sqrt(D$))/2/A         
         root = 'x1 = ' & X[1].X.a & '|' & |
                  'x2 = ' & X[2].X.a
      else   
         X[1].X.a = -B/2/A; X[1].X.b = sqrt(-D$)/2/A         
         X[2].X.a = -B/2/A; X[2].X.b = -sqrt(-D$)/2/A         
         root = 'x1 = (' & X[1].X.a & ', ' & X[1].X.b & ')' & '|' & | 
                'x2 = (' & X[2].X.a & ', ' & X[2].X.b & ')'
      end
      loop i# = 1 to 2 
         !loop j# = 1 to 2 
            if X[i#].X.a or X[i#].X.b
               if D$ ~< 0
                  X[i#].F = choose(A=0,'',A&'*'&X[i#].X.a&'^2')&choose(B=0,'',choose(B>0,'+','')&B&'*'&X[i#].X.a)&choose(C=0,'',choose(C>0,'+','')&C)
                  X[i#].R.a = round(EVALUATE(X[i#].F),0.0000000000001)
                  check_ = check_ & choose(check_<>'','|','') & X[i#].F&'=' & X[i#].R.a
               else   
                  CX1.a = X[i#].X.a; CX1.b = X[i#].X.b
                  CX2.a = A; CX2.b = 0
                  cxMul(CX1, CX1, CX3) ! x^2
                  cxMul(CX2, CX3, CX3) ! a*x^2
                  X[i#].R = CX3
                  CX2.a = B; CX2.b = 0
                  cxMul(CX1, CX2, CX3) ! b*x
                  CX2 = X[i#].R
                  cxSum(CX2,CX3,CX1) ! a*x^2 + b*x
                  X[i#].R = CX1
                  CX2.a = C; CX2.b = 0
                  cxSum(CX1,CX2,CX3) ! a*x^2 + b*x + c
                  X[i#].R = CX3
                  check_ = check_ & choose(check_<>'','|','') &'= (' & X[i#].R.a & ', ' & X[i#].R.b & ')'
               end   
            end   
         !end   
      end   
      message(choose(A=0,'','D='&D$&'|----------|')&|
         root&|
         choose(A=0,'',choose(check_>'',|
         '|----------|'&|
         check_,'')),'Quadratic equation')

cxSum            PROCEDURE(cxA, cxB, cxRes)
      CODE
         cxRes.a = cxA.a + cxB.a
         cxRes.b = cxA.b + cxB.b

cxMul            PROCEDURE(cxA, cxB, cxRes)
      CODE
         cxRes.a = cxA.a*cxB.a - cxA.b*cxB.b
         cxRes.b = cxA.a*cxB.b + cxB.a*cxA.b

cxDiv            PROCEDURE(cxA, cxB, cxRes)
      CODE
         cxRes.a = (cxA.a*cxB.a + cxA.b*cxB.b) / (cxB.a^2 + cxB.a^2)
         cxRes.b = (cxB.a*cxA.b - cxB.b*cxA.a) / (cxB.a^2 + cxB.a^2)

Числа Фибоначчи:

Пример для версий Clarion C10

использование 64-битной арифметики

  PROGRAM

OMIT('***')
 * User: Shur
 * Date: 29.02.2016
 * Time: 21:18
 ***

  MAP
      include('i64.inc')
ShowINT64  PROCEDURE(*INT64 a),STRING
  END

a                    LIKE(INT64)
b                    LIKE(INT64)
c                    LIKE(INT64)
str1                 CSTRING(32000)
str2                 CSTRING(32000)

   CODE
      a.lo = 1
      str1 = '1=' & ShowINT64(a)         
      b.lo = 1
      str1 = str1 & '|2=' & ShowINT64(b) 
      str2 ='1, 1'
      loop i# = 3 to 200 
         i64Add(a,b,c)
         if i64Sign(c) = -1
            break
         end   
         a :=: b ! deep assignment uses for structures
         b = c   ! usual assignment can be also used     
         str1 = str1 & '|' & i# & '=' & ShowINT64(c)         
         str2 = str2 & ', ' & ShowINT64(c)         
      end
      message(str2,'Fibonacci',,,,10b)
      message(str1,'Fibonacci',,,,10b)
            
ShowINT64           PROCEDURE(a)
d DECIMAL(30,0)
   CODE
      i64ToDecimal(d,a)
      return(d)

Факториал:

Пример для версий Clarion C10

используется рекурсия. вычисляются 20 членов ряда.

1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 6227020800 14! = 87178291200 15! = 1307674368000 16! = 20922789888000 17! = 355687428096000 18! = 6402373705728000 19! = 121645100408832000 20! = 2432902008176640000

  PROGRAM

OMIT('***')
 * User: Shur
 * Date: 29.02.2016
 * Time: 23:49
 ***

  MAP
      include('i64.inc')
Factorial PROCEDURE(SHORT,*INT64 a)
ShowINT64  PROCEDURE(*INT64 a),STRING
  END

a                    LIKE(INT64)
b                    LIKE(INT64)
c                    LIKE(INT64)
str1                 CSTRING(32000)
str2                 CSTRING(32000)

   CODE       
      Factorial(20,a)
      message(str1,'Factorial',,,,10b)

Factorial            PROCEDURE(SHORT n,*INT64 a)
b like(INT64)
   CODE
      if n = 1 then
         i64Assign(a,1)
         str1 = '1! = 1'
         RETURN
      .
      i64Assign(b,n)     
      Factorial(n-1,a)
      if a.lo = 0 and a.hi = 0
         RETURN
      .   
      i64Mult(a,b,c)
      if i64Sign(c) = -1 
         i64Assign(a,0)
         RETURN
      .   
      a :=: c
      str1 = str1 & '|' & n & '! = ' & ShowINT64(a)
      
ShowINT64           PROCEDURE(a)
d DECIMAL(30,0)
   CODE
      i64ToDecimal(d,a)
      return(d)

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам