A deep dive into the inner workings of ClojureScript's analysis,
88 compilation, and runtime phases. The talk focused specifically on
89 the way that traditional JavaScript abstractions thwart code-size
90 and efficiency and how ClojureScript avoids such pitfalls. Finally,
91 I told a couple "war stories" about some of the specific challenges
92 met by the Clojure/core team during the development of the compiler
93 and runtime.
Schibsted collects and analyzes 900 million events/day using AWS. This presentation gives an overview of the systems and architecture, including the solutions to GDPR.
Schibsted collects and analyzes 900 million events/day using AWS. This presentation gives an overview of the systems and architecture, including the solutions to GDPR.
Look past the square braces and the damned header files and Objective-C -- the essential language of iOS development -- really isn't that different from other object-oriented languages. Classes, single-inheritance, polymorphism, implementation hiding... check, check, check, and check. So it's really not that difficult for old Java / Python / Ruby / C++ dogs to learn new tricks once they install Xcode, right?
To be a competent Obj-C programmer, not that hard.
To be a great Obj-C programmer... now that's another story.
In this session, we will look at traits that are unique to Objective-C, the tricks that bring out the expressiveness and power of the language. We'll also look at how to write idiomatic code that will be easily understood and maintained by other Objective-C developers. We'll look at how Automatic Reference Counting resembles but is really nothing like Garbage Collection, how properties put plain old instance variables to shame, how we loosely couple classes with delegates and notification, how blocks help us un-block our code by simplifying asynchronicity, and more.
The State of Managed Runtimes 2013, by Attila SzegediZeroTurnaround
There’s JVM, and that’s it, right? Well, not exactly. Even within JVM, there’s an increasing support for running all kinds of non-Java languages: we have invokedynamic, but it’s being improved, and new layers of functionality are emerging on top of it, making JVM a better home for all kinds of programming languages. There’s life outside of JVM too. JavaScript seems to be a new assembler-lever compilation target even for C programs (I’ll show some amusing examples of what exactly you can run these days in a browser) , and there are some independent efforts at managed runtimes in various stages of completion that seem promising – PyPy, Topaz, Rubinius, Parrot VM (it’s alive again!). This talk is admittedly a language-runtime-enthusiast’s walk-through the things he finds interesting happening this year. Recorded at GeekOut 2013.
Spring Data Requery is alternatives of Spring Data JPA
Requery is lightweight ORM for DBMS (MySQL, PostgreSQL, H2, SQLite, Oracle, SQL Server)
Spring Data Requery provide Query By Native Query, Query By Example and Query By Property like Spring Data JPA
Spring Data Requery is better performance than JPA
JRuby 9000 introduced a new intermediate representation that allows us to use classic compiler strategies to optimize Ruby. This talk describes what we're doing with this new IR and why current JVM capabilities are not sufficient.
A status update on JRuby, covering compatibility, Rails, and next-gen performance numbers. JRuby is currently the fastest way to run Rails apps, and we're doing work to make it even faster in the future.
Caching has been an essential strategy for greater performance in computing since the beginning of the field. Nearly all applications have data access patterns that make caching an attractive technique, but caching also has hidden trade-offs related to concurrency, memory usage, and latency.
As we build larger distributed systems, caching continues to be a critical technique for building scalable, high-throughput, low-latency applications. Large systems tend to magnify the caching trade-offs and have created new approaches to distributed caching. There are unique challenges in testing systems like these as well.
Ehcache and Terracotta provide a unique way to start with simple caching for a small system and grow that system over time with a consistent API while maintaining low-latency, high-throughput caching.
A presentation at Twitter's official developer conference, Chirp, about why we use the Scala programming language and how we build services in it. Provides a tour of a number of libraries and tools, both developed at Twitter and otherwise.
Explains how to make use of ruby in java-based work environments. There are some hints at .NET equivalents along the way.
This is part 3 of a trilogy of Star Wars-themed ruby talks given at Protegra's SDEC 2011 in Winnipeg, Canada.
Look past the square braces and the damned header files and Objective-C -- the essential language of iOS development -- really isn't that different from other object-oriented languages. Classes, single-inheritance, polymorphism, implementation hiding... check, check, check, and check. So it's really not that difficult for old Java / Python / Ruby / C++ dogs to learn new tricks once they install Xcode, right?
To be a competent Obj-C programmer, not that hard.
To be a great Obj-C programmer... now that's another story.
In this session, we will look at traits that are unique to Objective-C, the tricks that bring out the expressiveness and power of the language. We'll also look at how to write idiomatic code that will be easily understood and maintained by other Objective-C developers. We'll look at how Automatic Reference Counting resembles but is really nothing like Garbage Collection, how properties put plain old instance variables to shame, how we loosely couple classes with delegates and notification, how blocks help us un-block our code by simplifying asynchronicity, and more.
The State of Managed Runtimes 2013, by Attila SzegediZeroTurnaround
There’s JVM, and that’s it, right? Well, not exactly. Even within JVM, there’s an increasing support for running all kinds of non-Java languages: we have invokedynamic, but it’s being improved, and new layers of functionality are emerging on top of it, making JVM a better home for all kinds of programming languages. There’s life outside of JVM too. JavaScript seems to be a new assembler-lever compilation target even for C programs (I’ll show some amusing examples of what exactly you can run these days in a browser) , and there are some independent efforts at managed runtimes in various stages of completion that seem promising – PyPy, Topaz, Rubinius, Parrot VM (it’s alive again!). This talk is admittedly a language-runtime-enthusiast’s walk-through the things he finds interesting happening this year. Recorded at GeekOut 2013.
Spring Data Requery is alternatives of Spring Data JPA
Requery is lightweight ORM for DBMS (MySQL, PostgreSQL, H2, SQLite, Oracle, SQL Server)
Spring Data Requery provide Query By Native Query, Query By Example and Query By Property like Spring Data JPA
Spring Data Requery is better performance than JPA
JRuby 9000 introduced a new intermediate representation that allows us to use classic compiler strategies to optimize Ruby. This talk describes what we're doing with this new IR and why current JVM capabilities are not sufficient.
A status update on JRuby, covering compatibility, Rails, and next-gen performance numbers. JRuby is currently the fastest way to run Rails apps, and we're doing work to make it even faster in the future.
Caching has been an essential strategy for greater performance in computing since the beginning of the field. Nearly all applications have data access patterns that make caching an attractive technique, but caching also has hidden trade-offs related to concurrency, memory usage, and latency.
As we build larger distributed systems, caching continues to be a critical technique for building scalable, high-throughput, low-latency applications. Large systems tend to magnify the caching trade-offs and have created new approaches to distributed caching. There are unique challenges in testing systems like these as well.
Ehcache and Terracotta provide a unique way to start with simple caching for a small system and grow that system over time with a consistent API while maintaining low-latency, high-throughput caching.
A presentation at Twitter's official developer conference, Chirp, about why we use the Scala programming language and how we build services in it. Provides a tour of a number of libraries and tools, both developed at Twitter and otherwise.
Explains how to make use of ruby in java-based work environments. There are some hints at .NET equivalents along the way.
This is part 3 of a trilogy of Star Wars-themed ruby talks given at Protegra's SDEC 2011 in Winnipeg, Canada.
Here is the presentation I did at Trifork GeekNights, January 12+13.
The talk is about my journey into Erlang land, how we need to start thinking about threads and processes in a new way, and some aspects of the work I have done towards implementing Erlang on the JVM platform.
Follow-up discussion either at my blog: http://javalimit.com/ or at http://groups.google.com/group/erjang
Yet another talk :)
This time in a lecture called “Markup Languages und Anwendungen”
Went pretty ok, but as usual I talked a little bit too fast ^_^
http://www.marc-seeger.de
User Interface Development with jQuerycolinbdclark
A half-day workshop covering all aspects of user interface development with jQuery. Starts with a JavaScript refresher, followed by coverage of each major feature of jQuery. Real world code samples are included throughout.
Presented by Colin Clark and Justin Obara at the 2010 Jasig Conference in San Diego.
Real-world polyglot programming on the JVM - Ben Summers (ONEIS)jaxLondonConference
Presented at JAX London 2013
Java is not the only language! The JVM is a wonderful common runtime for a wide variety of languages. By using the right language for each task, you can deliver higher quality applications in less time.
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
In this insightful webinar, Inflectra explores how artificial intelligence (AI) is transforming software development and testing. Discover how AI-powered tools are revolutionizing every stage of the software development lifecycle (SDLC), from design and prototyping to testing, deployment, and monitoring.
Learn about:
• The Future of Testing: How AI is shifting testing towards verification, analysis, and higher-level skills, while reducing repetitive tasks.
• Test Automation: How AI-powered test case generation, optimization, and self-healing tests are making testing more efficient and effective.
• Visual Testing: Explore the emerging capabilities of AI in visual testing and how it's set to revolutionize UI verification.
• Inflectra's AI Solutions: See demonstrations of Inflectra's cutting-edge AI tools like the ChatGPT plugin and Azure Open AI platform, designed to streamline your testing process.
Whether you're a developer, tester, or QA professional, this webinar will give you valuable insights into how AI is shaping the future of software delivery.
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
Let's dive deeper into the world of ODC! Ricardo Alves (OutSystems) will join us to tell all about the new Data Fabric. After that, Sezen de Bruijn (OutSystems) will get into the details on how to best design a sturdy architecture within ODC.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
UiPath Test Automation using UiPath Test Suite series, part 3DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 3. In this session, we will cover desktop automation along with UI automation.
Topics covered:
UI automation Introduction,
UI automation Sample
Desktop automation flow
Pradeep Chinnala, Senior Consultant Automation Developer @WonderBotz and UiPath MVP
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
Sidekick Solutions uses Bonterra Impact Management (fka Social Solutions Apricot) and automation solutions to integrate data for business workflows.
We believe integration and automation are essential to user experience and the promise of efficient work through technology. Automation is the critical ingredient to realizing that full vision. We develop integration products and services for Bonterra Case Management software to support the deployment of automations for a variety of use cases.
This video focuses on the notifications, alerts, and approval requests using Slack for Bonterra Impact Management. The solutions covered in this webinar can also be deployed for Microsoft Teams.
Interested in deploying notification automations for Bonterra Impact Management? Contact us at sales@sidekicksolutionsllc.com to discuss next steps.
Essentials of Automations: Optimizing FME Workflows with ParametersSafe Software
Are you looking to streamline your workflows and boost your projects’ efficiency? Do you find yourself searching for ways to add flexibility and control over your FME workflows? If so, you’re in the right place.
Join us for an insightful dive into the world of FME parameters, a critical element in optimizing workflow efficiency. This webinar marks the beginning of our three-part “Essentials of Automation” series. This first webinar is designed to equip you with the knowledge and skills to utilize parameters effectively: enhancing the flexibility, maintainability, and user control of your FME projects.
Here’s what you’ll gain:
- Essentials of FME Parameters: Understand the pivotal role of parameters, including Reader/Writer, Transformer, User, and FME Flow categories. Discover how they are the key to unlocking automation and optimization within your workflows.
- Practical Applications in FME Form: Delve into key user parameter types including choice, connections, and file URLs. Allow users to control how a workflow runs, making your workflows more reusable. Learn to import values and deliver the best user experience for your workflows while enhancing accuracy.
- Optimization Strategies in FME Flow: Explore the creation and strategic deployment of parameters in FME Flow, including the use of deployment and geometry parameters, to maximize workflow efficiency.
- Pro Tips for Success: Gain insights on parameterizing connections and leveraging new features like Conditional Visibility for clarity and simplicity.
We’ll wrap up with a glimpse into future webinars, followed by a Q&A session to address your specific questions surrounding this topic.
Don’t miss this opportunity to elevate your FME expertise and drive your projects to new heights of efficiency.
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
Epistemic Interaction - tuning interfaces to provide information for AI supportAlan Dix
Paper presented at SYNERGY workshop at AVI 2024, Genoa, Italy. 3rd June 2024
https://alandix.com/academic/papers/synergy2024-epistemic/
As machine learning integrates deeper into human-computer interactions, the concept of epistemic interaction emerges, aiming to refine these interactions to enhance system adaptability. This approach encourages minor, intentional adjustments in user behaviour to enrich the data available for system learning. This paper introduces epistemic interaction within the context of human-system communication, illustrating how deliberate interaction design can improve system understanding and adaptation. Through concrete examples, we demonstrate the potential of epistemic interaction to significantly advance human-computer interaction by leveraging intuitive human communication strategies to inform system design and functionality, offering a novel pathway for enriching user-system engagements.
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
8. Primacy
of
Semantics
I also regard syntactical problems as essentially irrelevant to programming languages at
their present stage ... the urgent task in programming languages is to explore the field
of semantic possibilities.
— Christopher Strachey - “Fundamental Concepts in Programming Languages”
9. JavaScript has much in common with
Scheme.
It is a dynamic language.
It has a flexible datatype (arrays) that can
easily simulate s-expressions.
And most importantly, functions are
lambdas.
http://javascript.crockford.com/little.html
53. Primacy
of
Syntax
one could say that all semantics is being represented as syntax
... semantics has vanished entirely to be replaced with pure syntax.
— John Shutt - “Primacy of Syntax”
68. Functional Inheritance
Pattern
• Private data
• Access to super methods
• Missing new safe
69. Functional Inheritance
Pattern
var person = function(spec) {
var that = {};
that.getName = function() { var me = person({'name' : 'Fogus'});
return spec.name; me.getName()
}; //=> 'Fogus'
return that;
};
var man = function(spec) {
var that = person(spec);
var super_getName = that.superior('getName');
var me = man({'name' : 'Fogus'});
that.getName = function() { me.getName()
return "Mr. " + super_getName(); //=> 'Mr. Fogus'
};
return that;
};
70. Functional Inheritance
Pattern Dangers
• Harder to minify
• Larger memory footprint
• Cannot update instances
• Eliminates instanceof
• Mucks with Function.prototype and
Object.prototype in an unsafe way
71. Pseudo-classical
Inheritance Pattern
Person = function(name) {
this._name = name;
};
var me = new Person('Fogus');
Person.prototype.getName = function() { me.getName()
return this._name; //=> 'Fogus'
};
Man = function(name) {
Person.call(this, name);
};
inherits(Man, Person); var me = new Man('Fogus');
me.getName()
Man.prototype.getName = function() { //=> 'Mr. Fogus'
return "Mr. "
+ Man._super.getName.call(this);
};
72. Pseudo-classical
Inheritance Pattern
• Harder Easier to minify
• Larger Smaller memory footprint
• Cannot Can update instances
• Eliminates instanceof
• Mucks with Clean
Function.prototype and
Object.prototype
77. Functional Inheritance
Inlining
var person = function(spec) { var myName = me.getName();
var that = {}; var sig = signature({‘name’ : myName});
sig.toString();
that.getName = function() { //=> ‘Sent from teh Fogus iPhone’
return spec.name;
};
return that;
};
78. Functional Inheritance
Inlining
var person = function(spec) { var myName = me.getName();
var that = {}; var sig = signature({‘name’ : myName});
sig.toString();
that.getName = function() { //=> ‘Sent from teh Fogus iPhone’
return spec.name;
};
return that;
};
?
79. Functional Inheritance
Inlining
var person = function(spec) { var myName = me.getName();
var that = {}; var sig = signature({‘name’ : myName});
sig.toString();
that.getName = function() { //=> ‘Sent from teh Fogus iPhone’
return spec.name;
};
return that;
};
var sig = signature({‘name’ : me.getName()});
sig.toString();
//=> ‘Sent from teh Fogus iPhone’
81. Pseudo-classical Inlining
Person = function(name) {
this._name = name;
var myName = me.getName();
};
var sig = new Signature(myName);
sig.toString();
Person.prototype.getName = function() {
//=> ‘Sent from teh Fogus iPhone’
return this._name;
};
?
82. Pseudo-classical Inlining
Person = function(name) {
this._name = name;
var myName = me.getName();
};
var sig = new Signature(myName);
sig.toString();
Person.prototype.getName = function() {
//=> ‘Sent from teh Fogus iPhone’
return this._name;
};
var sig = new Signature(me._name);
sig.toString();
//=> ‘Sent from teh Fogus iPhone’
91. Dead-code Elimination
Intro
(function (){
(let [a 1 var a__847 = 1;
b 2 var b__848 = 2;
a b] var a__849 = b__848;
a)
return a__849;
;=> 2 })();
92. Dead-code Elimination
Intro
(function (){
(let [a 1 var a__847 = 1;
b 2 var b__848 = 2;
a b] var a__849 = b__848;
a)
return a__849;
;=> 2 })();
?
93. Dead-code Elimination
Intro
(function (){
(let [a 1 var a__847 = 1;
b 2 var b__848 = 2;
a b] var a__849 = b__848;
a)
return a__849;
;=> 2 })();
2
94. Dead-code Elimination
Intro
(function (){
(let [a 1 var a__847 = 1;
b 2 var b__848 = 2;
a b] var a__849 = b__848;
a)
return a__849;
;=> 2 })();
95. Functional Inheritance
Dead-code
var person = function(spec) {
var that = {};
var hasBeard = false;
that.getName = function() {
return spec.name;
};
return that;
};
var man = function(spec) {
var that = person(spec);
var super_getName = that.superior(‘getName’);
that.getName = function() {
return "Mr. " + super_getName();
};
return that;
};
96. Functional Inheritance
Dead-code
var person = function(spec) {
var that = {};
var hasBeard = false;
that.getName = function() {
return spec.name;
};
return that;
};
var man = function(spec) {
var that = person(spec);
All good
var super_getName = that.superior(‘getName’);
Right?
that.getName = function() {
return "Mr. " + super_getName();
};
return that;
};
97. Functional Inheritance
Dead-code
var person = function(spec) {
var that = {};
var hasBeard = false;
that.getName = function() { Cursed
return spec.name;
};
return that;
Closures!
};
var man = function(spec) {
var that = person(spec);
var super_getName = that.superior(‘getName’);
that.getName = function() {
return "Mr. " + super_getName();
};
return that;
};
106. Functional Inheritance
Updating
var person = function(spec) {
var that = {};
that.getName = function() {
return spec.name;
};
return that;
};
var me = person({'name' : 'Fogus'});
var you = person({'name' : 'Cersei'});
How can we add hasBeard to every instance
now and in the future?
107. Functional Inheritance
Updating
var person = function(spec) {
var that = {};
that.getName = function() {
return spec.name;
};
return that;
};
var me = person({'name' : 'Fogus'});
var you = person({'name' : 'Cersei'});
How can we add hasBeard to every instance
now and in the future?
One at a time... every single time
109. ClojureScript
Extending
(defprotocol Catable
(cat [this other]))
(def sound1 "Meow")
(def sound2 "Mao")
(cat sound1 sound2)
; ASPLODE!
How can we allow cat to work with every instance
now and in the future?
111. Pseudo-classical
Updating
Person = function(name) {
this._name = name;
};
Person.prototype.getName = function() {
return this._name;
};
var me = new Person(‘Fogus’);
var you = new Person(‘Cercei’);
How can we add hasBeard to every instance
now and in the future?
112. Pseudo-classical
Updating
Person = function(name) {
this._name = name;
};
Person.prototype.getName = function() {
return this._name;
};
var me = new Person(‘Fogus’);
var you = new Person(‘Cercei’);
How can we add hasBeard to every instance
now and in the future?
Person.prototype.hasBeard = function() { return false };
128. ClojureScript
applyTo
• A function stored on ClojureScript functions
• Only if they have var args
• Compiled to only deal with the args seq at
the maximum fixed arity
• This ensures that an infinite seq is not
realized
129. ClojureScript apply
(defn apply
[f arg-seq]
(if (.applyTo f)
(if (<= bounded-count fixed-arity)
(.apply f (to-array arg-seq))
(.applyTo f args))
(.apply f (to-array arg-seq)))
130. ClojureScript apply
(defn apply
[f arg-seq]
(if (.applyTo f)
(if (<= bounded-count fixed-arity)
(.apply f (to-array arg-seq))
(.applyTo f args))
(.apply f (to-array arg-seq)))
131. ClojureScript apply
(defn apply
[f arg-seq]
(if (.applyTo f)
(if (<= bounded-count fixed-arity)
(.apply f (to-array arg-seq))
(.applyTo f args))
(.apply f (to-array arg-seq)))
132. ClojureScript apply
(defn apply
[f arg-seq]
(if (.applyTo f)
(if (<= bounded-count fixed-arity)
(.apply f (to-array arg-seq))
(.applyTo f args))
(.apply f (to-array arg-seq)))
166. Don’t Tread on Me
Function.prototype.method = function(name, f) {
this.prototype[name] = f;
return this;
};
Object.method('superior', function(name) {
var that = function;
var method = that[name];
return function() {
return method.apply(that, arguments);
};
});
167. ClojureScript Gently
Caresses
Object & Function
as One Might Caress
the finest Fabergé Egg
168. Look with your eyes,
not with your hands
var inherits = function(child, parent) {
function tmp() {};
tmp.prototype = parent.prototype;
child._super = parent.prototype;
child.prototype = new tmp();
child.prototype.constructor = child;
};
169. Var Args
JavaScript ClojureScript
function stuffToArray() { (defn stuff->seq
// create an array of stuff [& stuff]
} stuff)
stuffToArray(1,2,3,4); (stuff->seq 1 2 3 4)
//=> [1,2,3,4] ;=> (1 2 3 4)
170. Var Args
JavaScript ClojureScript
function stuffToArray() { (defn stuff->seq
// create an array of stuff [& stuff]
} stuff)
stuffToArray(1,2,3,4); (stuff->seq 1 2 3 4)
//=> [1,2,3,4] ;=> (1 2 3 4)
* Really this is the only snarky language joke I&#x2019;ll say all day. \n
* This is Douglass Crockford\n* Seems like a nice guy\n* Wrote a book about using only the nice parts of JS\n
* But there is something sinister about this advice!\n
* How is JavaScript like a Russian novel?\n
\n
* Semicolons\n
* Namespacing\n
* Closure pattern\n
* LET pattern\n
* VAR\n
* privates\n
* publics\n
* And after all of that... you can add some functionality.\n
* You need to introduce thousands of characters before anything happens.\n
\n
\n
Anyone have experience with GClosure? It&#x2019;s tough to follow the conventions. I wrote every function/form in js *before* I wrote the cljs impl.\n
\n
\n
\n
* conventions conventions conventions\n* It&#x2019;s too much to think about sometimes, but people will get used to *anything*\n* But you&#x2019;ve still not yet solved the problem at hand.\n* JS with a rabid adherence to conventions is 84% as safe as Haskell!\n
* All useful semantics become syntax.\n* In JS, its syntax betrays its semantics because intent is buried in idiom, verbosity, and safety checks.\n* CLJS (and LISP) leave syntax as an open set in order to allow one to build the syntax to match the semantics.\n\n| Isn't the semantics more important the syntax?\n\ngenerally speaking, if this were true, we would not see the syntax-fixation\nthat the whole industry is built on. syntax _distinguishes_ programming\nlanguages from each other; the semantics is only a question of how much of\nthe syntax you need to implement it. e.g., if CFRONT can produce C code\nfrom C++, so can a human. syntax can help automate the expression of the\nsemantics in very important ways, or serve to frustrate the same process.\nhowever, certain operations are possible (that is, sufficiently easy) on\ncertain syntaxes, which leads me to the more specific interpretation.\n
* Let&#x2019;s talk a moment to talk about CoffeeScript\n* Enjoyed my time\n* JS the good parts -- eliminates much of the ceremony, many edge cases (while introducing some of its own)\n* But maybe we need something more...\n
Asynchronous - DOM - Constant serialization - Limited resources and slow pipes - Hostile environment\n
\n
\n
* Because you can!\n* Although there are many flavors, they tend to a common pattern...\n
* This is a namespaced JS function.\n* Nested objects\n
\n
* This leads me into a nice discussion about compression potential...\n
* What do I mean?\n* Not golfing!\n
* You can get fairly compressed in the second example, but this is indicative only of this problem, and not in the language itself.\n* CoffeeScript doesn&#x2019;t fix this. It shaves characters, but that&#x2019;s all.\n
\n
* Why so many class systems? \n* Because you can!\n* Many suffer from a lack of safety or composability\n
\n
\n
\n
\n
\n
\n
* Clojure ensures safety by...\n
* To Crockford&#x2019;s credit, his is better encapsulated.\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
* functions cause complication\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
* Simple as CLJ\n
* Compiler Macros\n
* AST\n
* AST\n
\n
* Well, this is what I&#x2019;ve already talked about\n
\n
* People are already using the analyzer\n* typing, Marg, etc.\n
\n
\n
\n
* AWESOME Syntax Tree!!!\n
\n
\n
\n
* Get rid of everything but the emitter\n* Remember it takes an AST\n