Dadas as tecnologias hoje disponíveis, e colocando o desempenho como o critério principal para desenvolver aplicações, não exitaria em sugerir Java como a linguagem ideal. Tendo em contraparte a necessidade maior tempo para construir o programa, comparado por exemplo a códigos escritos em Python para a mesma solução.

Porém nos últimos anos a utilização de linguagens de programação funcional propõe derrubar tal paradigma – quanto mais rápido o código mais complexa seria a programação – uma premissa que sempre ouvi, principalmente do pessoal que programava em assembler em ambiente de mainframe.

E o que um cientista de dados tem a ver com isso?

Na verdade, o uso de programação funcional extrapola o desenvolvimento de aplicativos. Podemos, por exemplo, desenhar uma plataforma de modelagem estatística com todos os seus processos baseada em Microservices, disparar rotinas de MapReduce dentro de um ambiente Hadoop ou ter acesso a qualquer library desenvolvida em java (machine learning, expert system, etl) através de poucas linhas de execução.

Para explicar os primeiros passos neste mundo de programação funcional, utilizaremos Clojure, um dialeto de Lisp* bastante utilizado no mercado, sendo tecnologia corriqueira em empresas como Netflix, Ebay, Amazon, Deutsch Bank, Twitter, Google e Facebook. No caso do Brasil, temos o NuBank como maior referência.

Outro ponto, para facilitar a introdução a Clojure faremos contraponto do seu código com as rotinas de macro** que existem no SAS, um facilitador na hora de repetir códigos e criar rotinas de análise.

Vejam alguns exemplos:

Símbolos – na terminologia SAS seriam variáveis de macro, que são diferentes das variáveis convencionais declaradas em dataset, no caso de Clojure a terminologia seria Símbolo, tanto Clojure quanto em macro SAS podemos declarar números e/ou string

Declarando símbolos 

SAS

%global x y;

%let x=1;

%let y=”frase de teste”;

CLOJURE

(def x 1)

(def y “frase de teste”)

Declarando símbolos locais

SAS

%let x=1;

%let y=”frase de teste”;

CLOJURE

(let x 1)

(let y “frase de teste”)

Funções – tipos de objeto que podem ser chamados

SAS

*declaracao;

%macro calculo1(x);

data _null_;

y=&x. + 1;

call symput(‘y’,y);

run;

%mend calculo1;

*execucao;

%calculo(2);

CLOJURE

;; declaracao

(def calculo1

(fn [x] (+ x 1)))

;;execução

(calculo1 2)

Listas – sua aplicação consiste em facilitar a replicação de uma função para diversos valores de uma lista

SAS

%let lista1=1 2 3 4 5 6 7 8 9 10;

%let lista2=”nome1 nome2 nome3 nome4 nome5 nome6 nome7 nome8″;

CLOJURE

(def lista1 [1,2,3,4,5,6,7,8,9,10] )

(def lista2 [“nome1” “nome2” “nome3” “nome4” “nome5” “nome6” “nome7” “nome8”])

Pesquisando em listas

SAS – extrair primeiro valor da lista

%let primeiro=%scan(&lista1, 1, “,”);

CLOJURE – extrair primeiro valor da lista

(first lista1)

observação1: Clojure também possui as funções last (último valor da lista) e rest (restante da lista após o primeiro)

observação2: Além das listas um outro tipo de objeto do Clojure são os vetores – utilizados com maior frequência inclusive – uma funcionalidade que não é nativa das macros SAS porém que pode ser desenvolvido com a utilização de data _null_ e call symput

Para alguém experiente em macros SAS, eu definiria Clojure como uma um recurso similar as macros que extrapola a tecnologia a ser utilizada, facilitando por exemplo a troca de um componente da arquitetura (exemplo: conexão com várias bases de dados) assim como a facilidade de replicar/paralelizar processos, e também como as macros SAS poder ser utilizada para replicação de código

E um ponto interessante: o SAS geralmente é criticado por ser uma forma de programar antiga – até ultrapassada – já que linguagens como Python e R incorporam uma estrutura orientada a objeto. Porém no contexto de linguagens como Clojure, as novas linguagens não seriam consideradas eficientes, baseado na máxima:

“It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.”

—Alan Perils

Logo temos a linguagem de macro SAS com uma lógica muito mais eficiente do que as linguagens dos softwares estatísticos mais modernos

*A programação funcional não é um tema novo, a Lisp, avó das linguagens funcionais é apenas um ano mais nova que a Fortran(1957)

** A comparação SAS macro vs Clojure é de caráter didático, pois, na prática, as macros SAS são facilitadores que visam apenas a não repetição de código, enquanto que Clojure tem como princípio o próprio código ser o dado, sendo uma linguagem muito mais completa e multifuncional

referências:

http://www.moxleystratton.com/blog/2008/05/01/clojure-tutorial-for-the-non-lisp-programmer/

http://blog.brunobonacci.com/2014/11/16/clojure-complete-guide-to-destructuring/

http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#titlepage.htm

http://www2.sas.com/proceedings/sugi29/243-29.pdf