Как стать автором
Обновить

Можно писать код и без переменных

Время на прочтение 3 мин
Количество просмотров 1K
Очень часто после фраз в духе: «Ну к примере в этом языке нету переменных, и от того нету проблем с...» или аналогичных с удивлением замечаю полное удивление в глазах собеседника. Это вызвано тем, что многие программисты не могут себе представить программу без такой вещи, как переменная. Ниже будет переведён пример такого кода на Plain C.

Данный код выполняет следующую задачу, он получает на входе массив из 4-х целых чисел, и определяет, могут ли они являться 4-мя сторонами прямоугольной трапеции.

Этот код ни в коей мере не претендует ни на эффективность, ни на выразительность и рассматривать его стоит только как пример того, что это возможно. Это связано с тем, что ни язык, ни задача не способствуют данному стилю программирования. И не смотря на это, можно выделить 1 сильную сторону этого кода, это хорошо выделенные абстракции.

Подробнее о переменных, и в более общем понимание, изменяемых состояниях можно прочитать статью «Изменяемое состояние: опасности и борьба с ними» Евгения Кирпичёва в первом выпуске журнала «Практика функционального программирования» по этой ссылке:
fprog.ru/2009/issue1/eugene-kirpichev-fighting-mutable-state

#include <stdio.h>

int find_dublicate(const int *lines)
{
  return find_dublicate2(lines, 0, 0);
}

int find_dublicate2(const int *lines, const int i)
{      
  const int result = find_dublicate3(lines, i, i + 1);
  if (result == -1)
    if (i < 3) return find_dublicate2(lines, i + 1);
    else return -1;
  else return result;                                            
}

int find_dublicate3(const int *lines,
                    const int i,
                    const int j)
{  
  if (lines[i] == lines[j])
    return lines[j];
  else
    if (j < 4) return find_dublicate3(lines, i, j + 1);
    else return -1;
}

int delete_duplicate(const int *lines, const int a, const int number)
{
  return delete_duplicate2(lines, a, 0, 2, number);
}

int delete_duplicate2(const int *lines, const int a,
                      const int i, const int j, const int number)
{
  if (lines[i] == a && j != 0)
    delete_duplicate2(lines, a, i + 1, j - 1, number);
  else if (number != 0)
    delete_duplicate2(lines, a, i + 1, j, number - 1);
  else return lines[i];
}

  
int max_AB(const int *AB)
{
  if (AB[0] > AB[1]) return 0;
  else return 1;
}

int main (int argc, char** argv)
{
  const int lines[] = {2,3,8,2};
  const int a = find_dublicate(lines);  
  if (a == -1) goto no;
  const int AB[2] = {delete_duplicate(lines, a, 0), delete_duplicate(lines, a, 1)};
  
  const int max = max_AB(AB);

  const int delta = AB[max] - AB[max ? 0 : 1];
  if (delta/2 < a) goto yes;
  else goto no;

yes:
 printf ("yes\n");
 return 0;
no:
 printf ("no\n");
 return 0;

}

* This source code was highlighted with Source Code Highlighter.


PS Код вроде работает правильно, хотя нормально не трестировался. Компилил gcc-4.2.1
PPS В веду некоторого непонимания, под переменной подразумевались объекты с изменяемым состоянием, а не именованный участоки памяти.
Теги:
Хабы:
-2
Комментарии 27
Комментарии Комментарии 27

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн