(message "Hello, World!")
Ask the right questions to secure the right Emacs Lisp talent among an increasingly shrinking pool of talent.
Emacs Lisp is a dialect of the Lisp programming language used as a scripting language by Emacs, a text editor family first developed in the mid-1970s by Richard Stallman. The primary purpose of Emacs Lisp is to customize and extend the functionality of Emacs. It was influenced by Maclisp, one of oldest member of lisp family and its development has been integral to GNU Project's mission for free software movement since 1985. Unlike many other languages, it was designed for interpretive use from inception due to its close integration with C-coded Emacs editing functions. Today, it remains an essential tool for programmers seeking extensible and customizable text editing capabilities.
The next 20 minutes of the interview should attempt to focus more specifically on the development questions used, and the level of depth and skill the engineer possesses.
'let' is used to create local variables, while 'setq' is used to set the value of an existing variable. The scope of a variable defined with 'let' is limited to the 'let' expression.
'car' and 'cdr' are used to access the elements of a cons cell. 'car' returns the first element and 'cdr' returns the rest of the elements.
You can define a function in Emacs Lisp using the 'defun' keyword. For example, '(defun my-function (arg) (message "Hello, %s" arg))'.
The basic data types in Emacs Lisp include integers, floats, symbols, cons cells, strings, vectors, hash-tables, and functions.
You can define a variable in Emacs Lisp using the 'defvar' or 'setq' function. For example, '(defvar my-variable 10)' or '(setq my-variable 10)'.
A good candidate should be open to feedback and criticism, as this indicates a willingness to learn and improve.
Their approach to problem-solving, especially in the context of Emacs Lisp, gives insight into their ability to handle complex tasks and challenges.
While not strictly necessary, experience with other Lisp dialects can be beneficial, as it indicates a broader understanding of the language family.
Clear communication is essential for collaboration and to ensure they can explain their code and decisions to non-technical stakeholders.
A strong understanding of the Emacs ecosystem, including packages, modes, and customization, is crucial for the development process.
This is crucial as it directly affects their ability to produce clean, efficient code and solve complex problems.
The next 20 minutes of the interview should attempt to focus more specifically on the development questions used, and the level of depth and skill the engineer possesses.
Emacs Lisp provides several functions to manipulate strings, including 'concat' to concatenate strings, 'substring' to extract a substring, and 'string-match' to match a regular expression.
'eq' tests if two symbols or cons cells are the same, 'eql' tests if two values are the same and of the same type, 'equal' tests if the structure of two values are the same, and 'equalp' does the same as 'equal' but ignores case for strings and considers numbers of different types to be equal if they represent the same numeric value.
You can read files using the 'insert-file-contents' function and write to files using the 'write-region' function.
Emacs Lisp provides several types of loops including 'while', 'dolist', 'dotimes', and recursion.
You can handle errors in Emacs Lisp using the 'condition-case' function. It allows you to catch and handle exceptions.
At this stage, a skilled Emacs Lisp engineer should have demonstrated proficiency in Emacs Lisp programming, understanding of functional programming concepts, and problem-solving skills. Red flags include lack of practical experience, difficulty articulating thoughts or ideas, or limited understanding of Emacs environment.
(message "Hello, World!")
(setq my-list '(1 2 3 4 5))
(car (cdr my-list))
(mapcar 'sqrt '(1 4 9 16 25))
(defun async-sqrt (n callback)
(run-at-time 1 nil (lambda () (funcall callback (sqrt n)))))
(defclass person ()
((name :initarg :name :initform "" :type string :documentation "Name of the person.")
(age :initarg :age :initform 0 :type number :documentation "Age of the person.")))
(let ((x 5))
(defun foo (y)
(+ x y))
(foo 3))
The final few interview questions for a Emacs Lisp candidate should typically focus on a combination of technical skills, personal goals, growth potential, team dynamics, and company culture.
Some limitations of Emacs Lisp include lack of support for concurrency, limited support for interacting with the operating system, and performance. You can work around these limitations by using external programs, using Emacs Lisp's support for asynchronous processes, or by writing performance-critical code in a different language and interfacing with it from Emacs Lisp.
Emacs Lisp does not natively support concurrency or parallelism. However, you can achieve similar effects using asynchronous processes or threads, although these are limited.
'load' reads and evaluates a file, 'require' does the same but checks if the module is already loaded, and 'autoload' only loads the file when a certain function is called.
You can interact with the operating system using functions like 'shell-command', which runs a shell command, or 'start-process', which starts a new process.
Macros in Emacs Lisp are a way to define new control structures or other language features. You can define a macro using the 'defmacro' keyword.
Back-end App Developer
Front-end Web Developer
Full Stack Developer (Java)
Full Stack Developer (.Net)
Full Stack Developer (MEAN)
Full Stack Developer (MERN)
DevOps Engineer
Database Engineer (AzureSQL)
Database Engineer (Oracle)
Database Engineer (General)
Solution Architect (.NET)
Solution Architect (Java)
Solution Architect (Ruby)
Solution Architect (Python)
AI Engineer (Python)
Sr. AI Engineer (Python)
AI Strategist (Python)
Business Intelligence Engineer
Systems Analyst
Mainframe Developer (COBOL)
Mainframe Developer (General)