Aqui está um pequeno exemplo de algum código no qual eu estava trabalhando. Na suíte de teste para um serviço da web Clojure , eu precisava de uma função rápida para consultar uma lista de todas as tabelas no banco de dados Postgres para que eu pudesse truncá-las como parte de um acessório. Aqui está o Clojure:
(ns example
(:require [korma.core :refer [exec-raw]]))
(def all-tables
(map #(:table_name %)
(exec-raw [(str "SELECT table_name "
"FROM information_schema.tables "
"WHERE table_schema='public' "
"AND table_type='BASE TABLE'")] :results)))
E para comparação, veja como isso pode parecer em Ruby:
require 'activerecord'
def all_tables
query = <<-SQL
SELECT table_name
FROM information_schema.tables
WHERE table_schema='public' AND table_type='BASE TABLE'
SQL
results = ActiveRecord::Base.connection.execute query
results.map { |r| r[:table_name] }
end
Observe as semelhanças? O Ruby é lido de cima para baixo, mas o Clojure é lido de dentro para fora. O fluxo é essencialmente:
- Crie uma string de consulta sql
- Execute-o em um banco de dados
- Aplique esta função anônima a cada um dos resultados
- Devolver implicitamente a nova coleção
Mesmo lendo do início ao fim, acho que o código Clojure se explica muito bem. “Mapeie esta função sobre a coleção de coisas que esta consulta retorna”. É claro que Ruby vence em simplicidade, mas Clojure continua a me surpreender com o quão expressivo pode ser. Depois de se acostumar com todos esses parênteses. 🙂