Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ceylon, el viaje del elefante

zoek
April 27, 2014

Ceylon, el viaje del elefante

Charla acerca de Ceylon en el Flisol Puebla 2014

zoek

April 27, 2014
Tweet

More Decks by zoek

Other Decks in Programming

Transcript

  1. RESUMEN 1. ¿Qué es Ceylon? 2. Disección de comandos 3.

    Caracteristicas del lenguaje 4. Estructuras 5. Polimorfismo 6. Tipos 7. Funciones, Clases e Interfaces 8. Modulos 9. Anotaciones 10. Metaprogramación 11. Demo 12. Futuro
  2. POTENTE Ceylon tiene un poderoso sistema de tipos estaticos que

    previenen muchos bugs mientras te permite expresar más, mas facilmente: union types intersection types higher order functions mixin inheritance enumerated types.
  3. LEGIBLE La realidad es que gastamos mas tiempo leyendo el

    código de otros que escribiendo el nuestro. Debido a esto, Ceylon propicia la legibilidad mediante una sintaxis regular, soporte para estructuras tipo árbol y un poco de azúcar sintatica donde es conveniente.
  4. PREDICTIVO Ceylon controla la complejidad con claridad. El lenguaje evita

    características implícitas mágicas con casos ambiguos. El compilador sigue reglas simples e intuitivas y produce errores signficativos.
  5. MODULAR Modularidad es el nucleo de el lenguaje, SDK y

    herramientas. El compilador produce modulos que pueden ser distribuidos mediante la siguiente generación de arquitectura de repositorios con Ceylon Herd como su enfoque social principal.
  6. CON HERRAMIENTAS Tipado estático es la tecnología que necesita killer

    tools. Ceylon trae consigo una conjunto de comandos muy completo, y una IDE (Eclipse) con búsqueda, refactoring, quick fixes + asistencia, autocompletado, debugging, y mucho más.
  7. UNA PLATAFORMA Ceylon es una plataforma completa con un moderno

    SDK diseñado desde cero. Corre en las máquinas de Java y JS. Ceylon provee interoperavilidad con Java and el Java SDK.
  8. NEW Genera un nuevo projecto de Ceylon m o o

    n @ i l c a p i t a n o : / t m p % c e y l o n n e w h e l l o - w o r l d - - h o l a E n t e r m o d u l e n a m e [ c o m . e x a m p l e . h e l l o w o r l d ] : o r g . k a l t i a . h o l a E n t e r m o d u l e v e r s i o n [ 1 . 0 . 0 ] : W o u l d y o u l i k e t o g e n e r a t e E c l i p s e p r o j e c t f i l e s ? ( y / n ) : y E n t e r E c l i p s e p r o j e c t n a m e [ o r g . k a l t i a . h o l a ] : W o u l d y o u l i k e t o g e n e r a t e a n a n t b u i l d . x m l ? ( y / n ) : y
  9. COMPILE Y COMPILE-JS Compila código fuente de Ceylon y Java

    y produce un módulo y archivos fuente en un repositorio. c e y l o n c o m p i l e o r g . k a l t i a . h o l a N o t e : C r e a t e d m o d u l e c o m . e x a m p l e . h o l a / 1 . 0 . 0
  10. RUN Y RUN-JS Ejecuta un programa de Ceylon. c e

    y l o n r u n o r g . k a l t i a . h o l a / 1 . 0 . 0
  11. INFO Muestra información acerca de los modulos en los repositorios.

    c e y l o n i n f o o r g . k a l t i a . h o l a S h o w i n g v e r s i o n s f o r m o d u l e : c o m . e x a m p l e . h e l l o w o r l d 1 . 0 . 0
  12. DOC Genera la documentación de la API desde las fuentes

    del modulo. c e y l o n d o c o r g . k a l t i a . h o l a 1 . 0 . 0
  13. DOC-TOOL Genera la documentación de una herramienta en el directorio

    especificado. c e y l o n d o c - t o o l - - o u t p u t = . / c o m p i l e - d o c c o m p i l e
  14. IMPORT-JAR Importa un archivo jar a un repositorio de Ceylon.

    c e y l o n i m p o r t - j a r o r g . n e o 4 j . c y p h e r / 2 . 0 . 0 ~ / S c r i v a n i a / n e o 4 j - c o m m u n i t y - 2 . 1 . 0 - M 0 1 / l i b / n e o 4 j - c y p h
  15. SRC Obtiene las fuentes desde un repositorio y extrae su

    contenido dentro del directorio source. r m - r s o u r c e s # B o r r a d o a c c i d e n t a l c e y l o n s r c o r g . k a l t i a . h o l a t r e e s o u r c e s o u r c e ` - - c o m ` - - e x a m p l e ` - - h e l l o w o r l d | - - m o d u l e . c e y l o n | - - p a c k a g e . c e y l o n ` - - r u n . c e y l o n 3 d i r e c t o r i e s , 3 f i l e s
  16. CONFIG Manipula los archivos de configuración de Ceylon. c e

    y l o n c o n f i g - - l o c a l s e t r e s o u r c e . c o m p i l e r f o r c e
  17. VERSION Muestra y actualiza el numero de versión en el

    descriptor de módulo. c e y l o n v e r s i o n - - s e t 1 . 0 . 1 - - d e p e n d e n c i e s c e y l o n . c o l l e c t i o n
  18. SINTAXIS FAMILIAR Sintaxis común en lenguajes derivados de C como

    Java y C++. v o i d s a l u d a ( S t r i n g s u j e t o = " M u n d o " ) { p r i n t ( " H o l a ` ` s u j e t o ` ` " ) ; }
  19. SINTAXIS DECLARATIVA PARA ESTRUCTURAS EN FORMA DE ÁRBOL. Permite adaptarse

    a estrcuturas en forma de árbol. H t m l h t m l = H t m l { d o c t y p e = h t m l 5 ; H e a d { t i t l e = " C e y l o n : h o m e p a g e " ; } ; B o d y { H 2 ( " W e l c o m e t o C e y l o n ` ` l a n g u a g e . v e r s i o n ` ` ! " ) , P ( " N o w g e t y o u r c o d e o n : ) " ) } ; } ;
  20. DOCUMENTACIÓN COMO PRIORIDAD Mediante anotaciones produce información valiosa y que

    es exportada por herramientas de Ceylon. " T h i s m o d u l e i s j u s t a s i l l y e x a m p l e . Y o u ' l l f i n d s o m e p r o p e r m o d u l e s i n t h e c o m m u n i t y r e p o s i t o r y [ C e y l o n H e r d ] [ H e r d ] . [ H e r d ] : h t t p : / / m o d u l e s . c e y l o n - l a n g . o r g H a p p y H e r d i n g ! " m o d u l e o r g . j b o s s . e x a m p l e " 1 . 0 . 0 " { i m p o r t c e y l o n . m a t h " 0 . 3 . 0 " ; i m p o r t c e y l o n . f i l e " 0 . 3 . 1 " ; }
  21. TIPOS DE DATOS (NADA NATIVO) No existen tipos de datos

    nativos en Ceylon. literal tipo 10 Integer 10 Integer 1.0 Float "cadena" String (Integer x) =< x Integer(Integer) `interface Request` InterfaceDeclaration class Persona() {} Persona() Persona() Persona
  22. IF Aplica a condición Booleana. Permite estrechar el tipo. i

    f ( i s I n t e g e r x , x < 1 0 ) { r e t u r n x + 1 ; }
  23. WHILE Justo como en derivados de C, permite el uso

    de break and continue. También puede estrechar el tipo.
  24. ASSERT Válida las condiciones, lanzando una excepcion del tipo AssertionException

    si no son cumplidas las condiciones. También puede estrechar el tipo. No puede ser deshabilitada en tiempo de ejecución. v o i d p r i n t S q r t ( O b j e c t x ) { a s s e r t ( i s F l o a t x , x > = 0 . 0 ) ; p r i n t ( x ^ 0 . 5 ) ; }
  25. ESTRECHAMIENTO DE TIPO Teniendo un elemento que puede ser de

    multiples tipos, podemos verificar si es el elemento que deseamos y ajustar la ejecución acorde a su diseño. v a l u e n u m = p a r s e I n t e g e r ( " 1 " ) ; / / b e f o r e t h e a s s e r t s t a t e m e n t n u m i s o f t y p e I n t e g e r ? a s s e r t ( e x i s t s n u m ) ; / / a f t e r t h e a s s e r t s t a t e m e n t n u m i s o f t y p e I n t e g e r v a l u e p l u s O n e = n u m + 1 ;
  26. FOR Itera a través de los objectos producidos por un

    objeto iterable. f o r ( p i n p e o p l e ) { i f ( p . a g e < 1 8 ) { m i n o r s = t r u e ; b r e a k ; } } e l s e { m i n o r s = f a l s e ; }
  27. COMPRENSION Permite filtrar y tranformar flujos de valores. [ f

    o r ( p i n p e o p l e ) i f ( p . a g e > = 1 8 ) p ]
  28. SWITCH Ejecuta código condicionalmente acorde a lista de casos Tres

    casos: ENUMERATED TYPES v o i d s w i t c h O n E n u m V a l u e s ( B o o l e a n b ) { s w i t c h ( b ) c a s e ( t r u e ) { p r i n t ( " y e s " ) ; } c a s e ( f a l s e ) { p r i n t ( " n o " ) ; } }
  29. SWITCH CONDICIONAL v o i d s w i t

    c h O n E n u m T y p e s ( F o o | B a r | B a z v a r ) { s w i t c h ( v a r ) c a s e ( i s F o o ) { p r i n t ( " F O O " ) ; } c a s e ( i s B a r ) { p r i n t ( " B A R " ) ; } c a s e ( i s B a z ) { p r i n t ( " B A Z " ) ; } }
  30. SWITCH CON LITERALES v o i d s w i

    t c h O n L i t e r a l V a l u e s ( I n t e g e r i ) { s w i t c h ( i ) c a s e ( 0 ) { p r i n t ( " z e r o " ) ; } c a s e ( 1 ) { p r i n t ( " o n e " ) ; } c a s e ( 2 ) { p r i n t ( " t w o " ) ; } e l s e { p r i n t ( " l o t s " ) ; } }
  31. TUPLAS Es un tipo de lista ligada, donde el tipo

    estático de la lista coincide con el tipo de cada elemento en la lista. [ F l o a t , F l o a t , F l o a t , S t r i n g ] o r i g i n = [ 0 . 0 , 0 . 0 , 0 . 0 , " o r i g i n " ] ;
  32. ITERABLES Son objetos que producen un flujo de valores. Los

    iterables satisfacen la interfas Iterable. Ceylon provee dos formas de lidiar con iterables. Se pueden construir iterables usando llaves. Valores opcionales: { S t r i n g * } w o r d s = { " h e l l o " , " w o r l d " } ; Valores obligatorios: { S t r i n g + } w o r d s = { " h e l l o " , " w o r l d " } ; { S t r i n g + } m o r e W o r d s = { " h o l a " , " m u n d o " , * w o r d s } ;
  33. -> (ENTRY) Operador infijo crea una Entrada tomando una clave

    y un valor. E n t r y < i n t e g e r , s t r i n g = " " > i n t N a m e = 1 - > " O n e " ; H a s h M a p { f o r ( p i n p e o p l e ) p . f i r s t N a m e + " " + p . l a s t N a m e - > p } < / i n t e g e r , >
  34. EXCEPCIONES Sigue los mismos fundamentos que Java, deriva de Exception.

    t r y { / / s o m e c o d e } c a t c h ( R e a d E x c e p t i o n e ) { / / c l e a n u p c o d e } c a t c h ( W r i t e E x c e p t i o n e ) { / / c l e a n u p c o d e } f i n a l l y { / / c l e a n u p c o d e } O con una expresion t r y ( R e a d e r i n p u t = o p e n ( ' / e t c / p a s s w d ' ) ) { / / . . . }
  35. También pueden ser utilizados en Tuplas RANGOS Podemos utilizar rangos

    para generar iterables. C h a r a c t e r [ ] u p p e r c a s e L e t t e r s = ' A ' . . ' Z ' ; I n t e g e r [ ] c o u n t D o w n = 1 0 . . 0 ; C h a r a c t e r [ ] s a l u d o = " h o l a " [ 1 : 3 ] ; / / E m p i e z a d e s d e e l i n d i c e u n o / / y t o m a 3 v a l o r e s I n t e g e r [ ] d e s p e d i d a = " A d i o s " [ 0 . . 3 ] ; / / T o m a d e s d e e l i n d i c e 0 a l 3
  36. EXPANSION El operador * permite expandir los elementos dentro de

    un iterable. S t r i n g [ ] a r g s ( S t r i n g * e ) = > e ; a r g s ( " u n o " , " d o s " ) ; a r g s ( * { " u n o " , " d o s " } ) ; { S t r i n g + } n a m e s = { " f o o " , " b a r " , " b a z " } ; { I n t e g e r + } s i z e s = n a m e s * . s i z e ; { S t r i n g + } n a m e s = { " f o o " , " b a r " , " b a z " } ; { S t r i n g + } i n i t i a l s = n a m e s * . i n i t i a l ( 1 ) ;
  37. POLIMORFISMO DE OPERADORES Casi todos los operadores pueden ser expresados

    en terminos de métodos definidos en clases e/o interfaces en el módulo del lenguaje. x . e q u a l s ( y ) ; = > x = = y ;
  38. PRIMITIVAS Los operadores que no tienen tales definiciones son llamados

    operadores primitivos. . (member) = (assignment) === (identity) is of () (positional invocation) {} (named argument invocation)
  39. ADVICE Si una identidad no aplica para T entonces no

    puedes usar esa identidad para reescribir las expresiones que envuelven a T
  40. PRINCIPAL TYPING El sistema de tipos esta basado en el

    analisis de el "mejor" o los tipos principales. Para cada expresión, un unico tipo mas especifico puede ser determinado, sin la necesidad de analizar el resto de la expresiones en las que aparece. Todos los tipos usados por el compilador son denotables. L i s t < c a p t u r e # 3 - o f ? > una parte integral de Ceylon es que provee soporte de primer orden a tipos union e interseccion.
  41. UNION Es tipo que acepta instancias de caulquiera de los

    tipos de una lista. P e r s o n | O r g a n i z a t i o n p e r s o n O r O r g a n i z a t i o n = . . . ;
  42. INTERSECCIÓN Es un tipo que acepta instancias que cumplen todos

    los tipos de P r i n t a b l e & S i z e d & P e r s i s t e n t p r i n t a b l e S i z e d P e r s i s t e n t = . . . ;
  43. INFERENCIA DE TIPOS Dado el siguiente código: v a l

    u e s t u f f = { " h e l l o " , " w o r l d " , 1 . 0 , - 1 } ; v a l u e j o i n e d S t u f f = c o n c a t e n a t e ( { " h e l l o " , " w o r l d " } , { 1 . 0 , 2 . 0 } , { } ) ; El compilador infiere los tipos: I t e r a b l e < S t r i n g | F l o a t | I n t e g e r > - > s t u f f S e q u e n t i a l < S t r i n g | F l o a t > - > j o i n e d S t u f f .
  44. TYPESAFE NULL No existe NullPointerException en Ceylon o algo similar.

    Ceylon requiere que especifiquemos cuando un tipo puede ser null; S t r i n g ? n o m b r e = . . . ; es azucar sintactica para: S t r i n g | N u l l n o m b r e = . . . ;
  45. FLOW-SENSITIVE TYPING Es la habilidad para estrechar un tipo usando

    condiciones como is y exists. v o i d h e l l o ( S t r i n g ? n a m e ) { i f ( i s S t r i n g n a m e ) { p r i n t ( " H e l l o , ` ` n a m e ` ` ! " ) ; } e l s e { p r i n t ( " H e l l o , w o r l d ! " ) ; } }
  46. SUBTIPOS ENUMERADOS Podemos emular el funcionamiento de los enums que

    hay en Java. a b s t r a c t c l a s s S u i t ( S t r i n g n a m e ) o f h e a r t s | d i a m o n d s | c l u b s | s p a d e s { } o b j e c t h e a r t s e x t e n d s S u i t ( " h e a r t s " ) { } o b j e c t d i a m o n d s e x t e n d s S u i t ( " d i a m o n d s " ) { } o b j e c t c l u b s e x t e n d s S u i t ( " c l u b s " ) { } o b j e c t s p a d e s e x t e n d s S u i t ( " s p a d e s " ) { } Y consumir todos los casos en Suit con switch: v o i d p r i n t S u i t ( S u i t s u i t ) { s w i t c h ( s u i t ) c a s e ( h e a r t s ) { p r i n t ( " H e a r t z e s " ) ; } c a s e ( d i a m o n d s ) { p r i n t ( " D i a m o n d z e s " ) ; } c a s e ( c l u b s ) { p r i n t ( " C l i d u b s " ) ; } c a s e ( s p a d e s ) { p r i n t ( " S p i d a d e s " ) ; } }
  47. DISJOINT si =X= y =Y= son clases, =X= no es

    una subclase de =Y= y =Y= no es una subclase de =X=. Si =X= es una clase final y =Y= es una interfaz no satisfecha por =X= Dos instancias de un tipo generico puede ser disjoint, =MutableList and MutableList=.
  48. ALIAS Provee de un nombre mas corto o mas semántico

    a una clase o interfas existente, especialmente si la clase o interfaz es un tipo parametrisado. Para uniones e intersecciones: a l i a s N u m = > F l o a t | I n t e g e r ;
  49. En interfaces: s h a r e d i n

    t e r f a c e P e o p l e = > S e t < p e r s o n > ; < / p e r s o n > En clases: c l a s s N a m e d < v a l u e > ( S t r i n g n a m e , V a l u e v a l ) g i v e n V a l u e s a t i s f i e s O b j e c t = > E n t r y < S t r i n g , V a l u e > ( n a m e , v a l ) ; < / v a l u e >
  50. También puedes refinar un alias si es miembro de una

    clase. c l a s s B u f f e r e d R e a d e r ( R e a d e r r e a d e r ) s a t i s f i e s R e a d e r { s h a r e d d e f a u l t c l a s s B u f f e r ( ) = > M u t a b l e L i s t < C h a r a c t e r > ( ) ; } c l a s s B u f f e r e d F i l e R e a d e r ( F i l e f i l e ) e x t e n d s B u f f e r e d R e a d e r ( F i l e R e a d e r ( f i l e ) ) { s h a r e d a c t u a l c l a s s B u f f e r ( ) = > M u t a b l e L i n k e d L i s t < C h a r a c t e r > ( ) ; . . . }
  51. FUNCIÓN Funciones son como en C. v o i d

    c o l o r F a v o r i t o ( C o l o r c ) { p r i n t ( " M i c o l o r f a v o r i t o e s ` ` c ` ` " ) ; }
  52. FUNCIONES DE ORDEN SUPERIOR Permiten ser pasadas como parámetro y

    devueltas por una función, además pueden ser asignadas a variables como valores. a l i a s C o l o r = > S t r i n g ; v a l u e d e v u l v e F u n c i o n C o l o r = > v o i d ( C o l o r ? c = n u l l ) { i f ( e x i s t s c ) { p r i n t ( " M i c o l o r f a v o r i t o e s ` ` c ` ` " ) ; } e l s e { p r i n t ( " E n a u s e n c i a d e l u z l a o s c u r i d a d p r e v a l e c e " ) ; } } ; d e v u l v e F u n c i o n C o l o r ( ) ;
  53. APLICACIÓN PARCIAL Permite que una función pueda tener varias listas

    de parámentros, cada una significando una invación que devuelve otra función. I n t e g e r s u m a ( I n t e g e r x ) ( I n t e g e r Y ) { r e t u r n x + y ; } v a l u e s u m a 3 = s u m a ( 3 ) ; s u m a 3 ( 5 ) ; / / = > 8
  54. CLASES E INTERFACES Lucen similar a java. " A p

    o l a r c o o r d i n a t e " c l a s s P o l a r ( a n g l e , r a d i u s ) { s h a r e d F l o a t a n g l e ; s h a r e d F l o a t r a d i u s ; s h a r e d P o l a r r o t a t e ( F l o a t r o t a t i o n ) = > P o l a r ( a n g l e + r o t a t i o n , r a d i u s ) ; s h a r e d P o l a r d i l a t e ( F l o a t d i l a t i o n ) = > P o l a r ( a n g l e , r a d i u s * d i l a t i o n ) ; s h a r e d S t r i n g d e s c r i p t i o n = " ( ` ` r a d i u s ` ` , ` ` a n g l e ` ` ) " ; } Y las interfaces tambien. i n t e r f a c e W r i t e r { s h a r e d f o r m a l F o r m a t t e r f o r m a t t e r ; s h a r e d f o r m a l v o i d w r i t e ( S t r i n g s t r i n g ) ;
  55. CLASES ABSTRACTAS Además por medio de una anotación podemos tener

    una clase abstracta. a b s t r a c t c l a s s P o i n t ( ) { s h a r e d f o r m a l P o l a r p o l a r ; s h a r e d f o r m a l C a r t e s i a n c a r t e s i a n ; s h a r e d f o r m a l P o i n t r o t a t e ( F l o a t r o t a t i o n ) ; s h a r e d f o r m a l P o i n t d i l a t e ( F l o a t d i l a t i o n ) ; }
  56. REFINAMIENTO También por medio de anotaciones podemos indicar cuando podemos

    reimplementar un elemento. c l a s s P e r s o n a ( S t r i n g n o m b r e ) { s h a r e d d e f a u l t S t r i n g d e s c r i p t i o n = > " ( M e l l a m o ` ` n o m b r e ` ` ) " ; } c l a s s N e r d ( S t r i n g n , S t r i n g f r a s e ) e x t e n d s P e r s o n a ( n ) { s h a r e d d e f a u l t S t r i n g d e s c r i p t i o n = > s u p e r . d e s c r i p t i o n + " , " + f r a s e ; }
  57. MULTIHERENCIA Usando el tipo intersección junto con las interfaces podemos

    simular un tipo Multiherencia. i n t e r f a c e P e r s o n a { s h a r e d f o r m a l S t r i n g n a m e ; s h a r e d f o r m a l S t r i n g e d a d ; s h a r e d B o o l e a n v i v o ( ) = > . . . ; } i n t e r f a c e U b i c a c i o n { s h a r e d f o r m a l S t r i n g d i r ; s h a r e d U C a r t e s i a n a u C a r t e s i a n a ( ) = > . . . ; } c l a s s H o g a r ( n a m e , e d a d , d i r ) s a t i s f i e s P e r s o n a & U b i c a c i o n { s h a r e d a c t u a l S t r i n g d i r ; s h a r e d a c t u a l S t r i n g e d a d ; s h a r e d a c t u a l S t r i n g n a m e ; }
  58. GENERICS Y RESTRICCIONES Y VARIANZA Ceylon provee legibilidad al código,

    tipos genericos y la posibilidad de imponer restricción a estos. s h a r e d c l a s s S i n g l e t o n < o u t e l e m e n t = " " > ( E l e m e n t e l e m e n t ) e x t e n d s O b j e c t ( ) s a t i s f i e s [ E l e m e n t + ] g i v e n E l e m e n t s a t i s f i e s O b j e c t { . . . } < / o u t >
  59. MÓDULOS Ceylon también se caracteriza por proveer a nivel de

    lenguaje constructores para paquetes y modulos, que van deacuerdo a un control de acceso provisto por =shared=. " [ H e r d ] : h t t p : / / m o d u l e s . c e y l o n - l a n g . o r g H a p p y H e r d i n g ! " m o d u l e o r g . j b o s s . e x a m p l e " 1 . 0 . 0 " { i m p o r t c e y l o n . m a t h " 0 . 3 . 0 " ; i m p o r t c e y l o n . f i l e " 0 . 3 . 1 " ; }
  60. ANOTACIONES Una anotación es una función superior que devuelve un

    subtipo de =ConstrainedAnnotation=. Vamos a llamar a esta función un *contructor de anotacion*. " A n n o t a t i o n t o s p e c i f y A P I d o c u m e n t a t i o n o f a p r o g r a m e l e m e n t . " s h a r e d a n n o t a t i o n D o c A n n o t a t i o n d o c ( S t r i n g d e s c r i p t i o n ) = > D o c A n n o t a t i o n ( d e s c r i p t i o n ) ;
  61. METAPROGRAMACIÓN Dada la capacidad de Ceylon de instrospeccion, podemos inspeccionar

    módulos y paquetes, asi como miembros de clases y asi poder ajustar el comportamiento de nuestro programa en tiempo de ejecución. v a l u e e n d = E n d p o i n t { p a t h = s t a r t s W i t h ( " / e c h o " ) ; s e r v i c e ( R e q u e s t r e q u e s t , R e s p o n s e r e s p o n s e ) = > r e s p o n s e . w r i t e S t r i n g ( r e q u e s t . q u e r y S t r i n g ) ; } ; v a l u e p = ` p a c k a g e o r g . k a l t i a . c e l y a . e n d p o i n t s ` ; v a l u e n s = p . m e m b e r s < v a l u e d e c l a r a t i o n > ( ) ; / / a s s e r t ( n o n e m p t y n s ) ; v a l u e s e r v e r = n e w S e r v e r ( [ f o r ( i i n n s ) i f ( i s E n d p o i n t i ) i ] ) ; < / v a l u e d e c l a r a t i o n >
  62. FUTURO Desarrollo Buildpack en Heroku Sheriff en producción Videojuego totalmente

    funcional en FirefoxOs Mejora en la traducción de tour de Ceylon Kaltia Curso online o presencial de Ceylon Recursos para aprender a usar la Terminal, LiveScript y Storm