You are on page 1of 15

Езикът JESS

Обозначения:
1. Символни низове в <ъглови-скоби> са вид данни, които
трябва да бъдат доставени;
2. Неща в [квадратни-скоби] не са задължителни;
3. Неща, завършващи с + може да се появяват един или
повече пъти;
4. Неща, завършващи с * може да се появяват нула или
повече пъти.
Входът в JESS е в свободен формат.
Новият ред като цяло не е от съществено значение и се третира
като интервал.
 Атоми
Атомът или символът е основно понятие в езика JESS. Атомите много
приличат на идентификаторите в другите езици.
Атомите в Jess могат да съдържат букви, цифри и следните специални
знаци: $ * = + / < > _ ? # . .
Атомът не може да започва с число.
Той може да започва с някои пунктуационни знаци (някои знаци имат
специално значение като оператори, когато атомът започва с тях).
Езикът Jess различава малки и големи букви.
 Пример:
foo, FOO и Foo са различни атоми.
Най-добрите атоми съдържат букви, цифри, подчертаващо тире
и тире. (Тиретата са традиционен разделител на думи.)
 Пример: Следните символни низове са валидни атоми.
foo first-value contestant#1 _abc

Има три специални атоми, които Jess интерпретира по по-


специален начин:
nil, което прилича на null стойността на Visual Basic;
TRUE и FALSE, които са булевите стойности на Jess.
 Числа
Jess използва Java функциите:
• java.lang.Integer.parseInt, за да опише целите числа
• java.lang.Double.parseDouble, за да опише числата с десетична
точка.
Примери за валидни числа: 3 4. 5.643 6.0E4 1D
 Символни низове
Символните низове в Jess се обозначават като се използват кавички
(“ “).
Обратно наклонената черта (\) може да бъде използвана, за да се
избягват вложените кавички.
Примери за валидни символни низове:
"foo" "Hello, World" "\"Nonsense, \" he said firmly." "Hello, There”
Символните низове в Jess имат следната особеност:
- не може да се вгради „нов ред“ в символен низ като се използва "\n„ (като
в JAVA).
Истински „нов ред“ е разрешен вътре в символния низ; той става част от
низа.
Пример:
"Hello,
There”
 Списъци
Друга основна единица от синтаксиса на Jess е списъкът. Списъкът винаги
се състои от набор от еднакъв брой отварящи се и затварящи се кръгли
скоби и нула или повече атоми, числа, символни низове и други списъци.
Примери за валидни списъци:
(+ 3 2) (a b c) ("Hello, World") () (deftemplate foo (slot bar))
Първият елемент на списък в Jess се нарича „глава“.
 Коментари
Коментарите в програмите на Jess започват с „точка и запетая“ (;) и
продължават до края на реда с текста.
Примери за коментари:
; This is a list
(a b c)
Коментарите могат да се появяват навсякъде в програмите на Jess.
 Функции
Целият код на Jess (контролни структури, задачи, процедурни
извиквания) е под формата на извикване на функция.
Извикванията на функции в Jess са просто списъци. При тях се
използва префиксният запис.
Списък, на който главата е атом, който е име на съществуваща функция,
може да бъде извикване на функция.
Пример: (+ 2 3).
Когато се оцени, стойността на този израз е числото 5.
Извикванията на функции може да се влагат. Външната функция е
отговорна за оценяването на вътрешната извикана функция.
Пример: (+ 2 (- 6 3))
Jess има голям набор от вградени функции като:
• математически,
• за контрол на програмата
• за обработка на символни низове
• за достъп до Java APIs.
Една от най-често използваните функции е printout.
printout се използва, за да се изпрати текст към стандартния изход на
Jess или към файл.
Пример: (printout t "The answer is " 42 "!" crlf)
The answer is 42!
 Променливи
Променливите в Jess са атоми, които започват със символа
въпросителен знак (?). Въпросителният знак е част от името на
променливата.
Нормалната променлива може да се отнася до единичен атом, число
или символен низ.
Променлива, на която първият символ е $ (например $?X) е
мултипроменлива, която се отнася до специален вид списък, който се
нарича multifield.
 Функция bind
Използва се за свързване на променлива със стойност
(bind ?x "The value")
"The value“
 multifield (с много полета) функция create$
Използва се за свързване на мултипроменлива
(bind $?grocery-list (create$ eggs bread milk))
(eggs bread milk)
Не е необходимо и не може променливите да се декларират преди
тяхното първо използване.
Изключение правят само специални променливи, наречени defglobals.
 Глобални променливи
Всяка променлива, създадена на най-високо ниво в програма на Jess се
нарича глобална. За да се създаде глобална променлива, която да не се
унищожава от функцията reset, може да се използва конструкцията
defglobal.
(defglobal [?<global-name> = <value>]+)
Имената на глобалните променливи трябва да започват и завършват с *.
Примери за валидни имена на глобални променливи:
?*a* ?*all-values* ?*counter*
Когато една глобална променлива се създава , тя се инициализира с
дадената стойност.
 Дефиниране на функции
Функции може да се дефинират като се използва deffunction конструктора.
deffunction конструктора изглежда по следния начин:
(deffunction <function-name> [<doc-comment>] (<parameter>*)
<expr>*
[<return-specifier>])
<function-name> трябва да бъде атом.
<parameter> трябва да е име на променлива.
Незадължителното поле <doc-comment> е символен низ, заграден с кавички,
който описва целта на функцията.
Незадължителното поле <return-specifier> дава върнатата стойност на
функцията.
Управлението на потока в deffunctions се постига чрез функциите за
управление foreach, if и while.
Задача: Да се напише функция, която връща по-големия от
двата й аргумента.

(deffunction max (?a ?b)


(if (> ?a ?b) then
(return ?a)
else
(return ?b)))
Тези два фрагмента са еквивалентни

(deffunction max (?a ?b) (deffunction max (?a ?b)


(if (> ?a ?b) then (if (> ?a ?b) then
?a (return ?a)
else else
?b)) (return ?b)))
(deffunction max (?a ?b)
(if (> ?a ?b) then
(return ?a)
else
(return ?b)))

(printout t "The greater of 3 and 5 is " (max


3 5) "." crlf)

You might also like