Описание системных функций HomeLisp

В этом разделе описывается библиотека системных функций, встроенных в HomeLisp. Эти функции предназначены для получения системной информации, вызова стандартных диалогов, и выполнение некоторых других действий, без которых в среде Windows трудно писать удобные программы.

Большая часть этих функций представляют собой Лисповские надстройки над соответствующими функциями Visual Basic или Windows API.

Имена всех системных функций для удобства начинаются с префикса SYS. Системные функции доступны при работе в среде разработки, в составе EXE-файла, а также из библиотеки HomeLispLib.Exe. При работе WEB-компоненты функции недоступны.

Имя функции К-во аргументов Тип аргументов Выполняемое действие
SYSARGC   - - Возвращает число аргументов командной строки
SYSARGV   1 FIXED Возвращает аргумент командной строки заданного номера
SYSCOMPNAME   - - Возвращает имя рабочей станции (имя компьютера)
SYSCOPY   2 STRING Копирует файл с именем, заданным значением ПЕРВОГО аргумента, в файл с именем, заданным значением ВТОРОГО аргумента.
SYSDATE   1 (необязательный) STRING Возвращает системную дату, отформатированную в соответствии со строкой-значением параметра. Если параметр опущен - выдается дата в стандартном формате.
SYSDIR   2 1-STRING; 2-BITS Возвращает список файлов и/или директорий, соответствующий шаблону сканирования, заданному ПЕРВЫМ аргументом. Тип элементов оглавления задаются ВТОРЫМ параметром.
SYSDISKSPACE   1 STRING Дает полный объем памяти и объем свободной памяти на заданном диске
SYSDRIVETYPE   1 STRING Дает тип носителя для логического диска, заданного параметром
SYSENV   1 STRING или FIXED Дает перменную окружения (по имени или по номеру)
SYSERASE   1 STRING Удаляет файл с именем, заданным значением параметра
SYSEXEC   3 1-STRING; 2-STRING; 3-FIXED Запускает приложение (16-и или 32-х-битное) c именем исполняемого файла, заданного значением ПЕРВОГО аргумента и командной строкой, заданной значением ВТОРОГО аргумента. Статус окна задается третьим параметром. После завершения приложения функция возвращает код завершения.
SYSGETATTR   1 STRING Возвращает характеристики файла с именем, заданным значением параметра
SYSGETCOLOR   - - Вызов стандартного диалога выбора цвета (ColorPicker)
SYSGETFONT   - - Вызов стандартного диалога выбора фонта
SYSGETOPENNAME   2 STRING Вызывает стандартный диалог "Открыть"
SYSGETSAVENAME   2 STRING Вызывает стандартный диалог "Сохранить как"
SYSHOME   - - Дает имя Home-директории
SYSLOGICALDRIVES   - - Дает информацию о логических дисках
SYSMEMSTATUS   - - Дает информацию о состоянии оперативной памяти
SYSMETRICS   - - Дает информацию о системных мериках (в частности, о разрешении экрана)
SYSMKDIR   1 STRING Создает директорию с имененм, заданным значением параметра.
SYSMODE   - - Дает режим работы: 1-IDE; 2-EXE; 3-DLL
SYSOSVER   - - Дает версию ОС
SYSRENAME   2 STRING Меняет имя у файла/директории, заданного значением ПЕРВОГО параметра на новое имя (заданное значением ВТОРОГО параметра)
SYSRMDIR   1 STRING Удаляет (пустую) директорию с имененм, заданным значением параметра.
SYSSETATTR   2 1-STRING; 2-BITS Устанавливает байт атрибутов, заданный значением ВТОРОГО параметра у файла с именем, заданным значением ПЕРВОГО аргумента.
SYSSHELL   1 STRING Выполняет заданный файл (ассоциативные действия)
SYSSYSDIR   - - Дает имя системной директории
SYSTIME   1 (необязательный) STRING Возвращает системное время, отформатированное в соответствии со строкой-значением параметра. Если параметр опущен - выдается время в стандартном формате.
SYSTMPDIR   - - Дает имя временной директории
SYSTMPFILE   3 STRING, FIXED, FIXED Дает имя временного файла
SYSUSERNAME   - - Дает имя пользователя
SYSWINDIR   - - Дает имя директории WINDOWS
SYSARGC  

Функция SYSARGC возвращает количество аргументов командной строки. Если в командной строке аргументы не заданы, функция возвращает нуль. При вызове из среды разработки, функция возвращает количество аргументов конфигурационного параметра "командная строка". При вызове из выполняющегося EXE-файла, функция возвращает число аргументов командной строки, заданное при запуске EXE-файла.

При вызове функции из библиотеки HomeLispLib.Exe результат зависит от способа вызова. Если используется скриптовая оболочка CONLISP или WLISP, то функция вернет количество параметров командной строки. Если пользователь использует библиотеку HomeLispLib.Exe напрямую (создавая объект Lisp и вызывая его методы), то функция SYSARGC вернет нуль.

Предположим, что параметр "командная строка" среды разработки равен -h -k -j -L. При вызове функции SYSARGC будет возвращен результат 4.

SYSARGV  

Функция SYSARGV принимает единственный параметр типа FIXED и возвращает аргумент командной строки с номером, равным значению параметра. Если значение аргумента превышает реальное количество параметров командной строки, то функция возвращает Nil.

При вызове функции из выполняющегося EXE-файла с нулевым значение параметра функция возвращает полное имя исполняемого файла. При вызове функции из среды разработки с нулевым значением параметра функция возвращает пустую строку. При вызове функции с нулевым параметром из выполняющегося скрипта (с интерпретатором CONLISP или WLISP) функция возвращает полное имя скриптового файла с соответствующим расширением.

Если значение аргумента меньше нуля, фиксируется состояние ошибки.

Предположим, что параметр "командная строка" среды разработки равен -h -k -j -L. Ниже приводятся примеры вызова функций SYSARGC и SYSARGV.


(for i 1 (sysargc) ((prints (sysargv i)) (terpri)))
-h
-k
-j
-L

==> 4

(sysargv 0)

==> ""
SYSCOMPNAME  

Функция SYSCOMPNAME возвращает сетвое имя компьютера, как строку, заключенную в двойные кавычки:


(syscompname)

==> "BOB"
SYSCOPY  

Функция SYSCOPY принимает два аргумента - оба типа STRING. Функция выполняет копирование файла, заданного первым аргументом в файл, заданный вторым аргументом. Оба имени могут содержать пути. Если путь не задан, предполагается файл, содержащийся в текущей директории. Если файл скопирован успешно, то функция возвращает нуль. Если исходный файл отсутствует, то выдается сообщение и фиксируется состояние ошибки. Вот примеры вызова Функции SYSCOPY:


(sysCopy "c:\autoexec.bat" "autoexec.bat") 

==> T

(sysCopy "c:\autoexex.bat" "autoexex.bat") 

sysCopy - файл c:\autoexex.bat не существует!

==> ERRSTATE

Файл "c:\autoexec.bat" копируется в текущую директорию. Копия завершается успешно. А попытка скопировать несуществующий файл вызывает ошибку с соответствующим предупреждением. Имена файлов могут содержать букву диска и директорию (как в приведенном выше примере), так и UNC-обозначение в виде \\Сервер\Ресурс\файл.

SYSDATE  

Функция SYSDATE возвращает системную дату. Функция имеет один необязательный аргумент строкового типа. Этот аргумент задает формат выводимой даты. Если аргумент опущен, дата выдается в соответствии с установками пользователя.

Параметр функции (строка формата) может состоять из любых символов. Но следующие группы символов формата интерпретируются особым образом:

dd - день;

mm - месяц;

yy - год (две младшие цифры);

yyyy - все 4 цифры года;

Остальные символы строки формата просто копируются в строку-результат. Вот примеры вызова SYSDATE:


(sysDate "dd-mm-yy")

==> "13-01-09"

(sysDate "mm-yy")

==> "01-09"

(sysDate "dd-yy")

==> "13-09"

(sysDate "dd-mm-yyyy")

==> "13-01-2009"

(sysDate "Дата: dd-mm-yyyy")

==> "Дата: 13-01-2009"

(sysDate)

==> "01-13-2009"

По последнему примеру можно убедиться, что при вызове функции без строки формата результат форматируется в соответствии с системными установками пользователя. В предпоследнем примере в строку формата внесен текст "Дата:"; видно, что этот текст перенесен в результат без преобразования. Из примеров видно также, что можно задавать не все элементы формата. В этом случае возвращается часть даты (в соответствии с заданными элементами).

SYSDIR  

Функция SYSDIR принимает два обязательных параметра: шаблон поиска файлов (строкового типа) и однобайтовую битовую шкалу атрибутов. Функция возвращает список имен файлов (или поддиректорий), удовлетворяющих шаблону поиска и имеющих атрибуты, заданные битовой шкалой.

Шаблон поиска файлов включает в себя имя директории и собственно шаблон - строку, содержащую кроме обычных символов еще и метасимволы * и ?. При задании имени директории действуют следующие соглашения:

1) Если путь не задан - составляется список файлов из текущей директории;

2) Символы ".\" означают ссылку на текущую директорию;

3) Символы "..\" означают ссылку на наддиректорию (директорию, расположенную уровнем выше текущей в дереве директорий).

Атрибуты в битовой шкале имеют следующий смысл:

Атрибут Бит
Normal &H00
Read Only &H01
Hidden &H02
System &H04
Volume &H08
Directory &H10
Archive &H20


Атрибуты можно комбинировать. Так шкала атрибутов &H06 обеспечит отбор файлов, у которых поднят Hidden или System. Важное замечание: Если в шкале атрибутов поднят бит директории (&H10), а сама шкала отлична от &H3F, то функция вернет список директорий.

Вот примеры вызова SYSDIR:


(sysDir "c:\*.txt" &H3F)

==> ("BOOTLOG.TXT" "FRUNLOG.TXT" "SETUPLOG.TXT" "NETLOG.TXT" "DETLOG.TXT" 
     "SETUPXLG.TXT" "regdlls.txt")

(sysDir "c:\" &H02)

==> ("BOOTLOG.TXT" "BOOTLOG.PRV" "SUHDLOG.DAT" "MSDOS.---" "SYSTEM.1ST" 
     "ffastun.ffl" "ffastun0.ffx" "ffastun.ffo" "ffastun.ffa" "HIGHVIEW.INI" 
     "HIGHVIEW.HIS" "ASD.LOG")

(sysDir "c:\" &H06)

==> ("IO.SYS" "MSDOS.SYS" "BOOTLOG.TXT" "BOOTLOG.PRV" "SUHDLOG.DAT" "MSDOS.---"
     "DETLOG.TXT" "SYSTEM.1ST" "DETLOG.OLD" "ffastun.ffl" "ffastun0.ffx" 
     "ffastun.ffo" "ffastun.ffa" "WINLFN.INI" "WINLFN1.INI" "HIGHVIEW.INI" 
     "HIGHVIEW.HIS" "ASD.LOG")

(sysDir "c:\" &H10)

==> ("WINDOWS" "YAMAHA" "Мои документы" "Program Files" "Dell" "Inetpub" "MSSQL7"
     "HPFONTS" "DivX3.11" "Temp" "My Intranet" "php" "Tmp")

Здесь при первом вызове функции SYSDIR показываются все текстовые файлы в корневой директории диска c:.

Второй вызов дает все скрытые файлы в корневой директории диска c:.

Третий вызов дает список всех файлов, имеющих атрибуты Hidden и System.

Последний вызов дает список директорий диска c:.

SYSDISKSPACE  

Функция SYSDISKSPACE принимает один обязательный параметр: имя диска (строкового типа). Если запрошенный диск существует, то функция возвращает список из трех чисел с плавающей точкой. Если же диск не существует, функция возвращает Nil.

Первое число списка-результата - это количество свободных байтов диска, доступных текущему пользователю.

Второе число списка-результата - это общее количество байтов диска.

Третье число списка-результата - это количество свободных байтов диска.

Вот примеры вызова SYSDISKSPACE:


(sysDiskSpace "t:")

==> NIL

(sysDiskSpace "a:")

==> (496128.0 1457664.0 496128.0)

(sysDiskSpace "z:")

==> (6289096704.0 9663676416.0 6289096704.0)

(/ (cadr (sysDiskSpace "c:")) (* 1024.0 1024.0 1024.0))

==> 9.75741577148438

Видно, что диска T: на компьютере нет; на диске a: свободно около 500 кБ, а все свободное пространство диска z: доступно текущему пользователю.

Последний вызов выделяет общую емкость диска (посредством вызова cadr), и переводит его в гигабайты делением на 10243. Получается, что диск c: имеет емкость ~ 9.76 Гб.

SYSDRIVETYPE  

Функция SYSDRIVETYPE принимает один обязательный параметр: имя любой директории диска (строкового типа) и возвращает тип диска в виде целого числа. Если функция возвращает нуль, значит произошла ошибка. Возврат единицы означает, что запрошенная директория не существует.

Возможные значения типа диска приводятся ниже:

Тип диска Характеристика
2 Сменный диск (дискета)
3 Жесткий диск
4 Сетевой диск
5 Компакт-диск
6 Электронный диск (RAM-drive)


Вот примеры вызова SYSDRIVETYPE:


(sysDriveType "a:\")

==> 2

(sysDriveType "i:\")

==> 2

(sysDriveType "e:\")

==> 3

(sysDriveType "c:\")

==> 3

(sysDriveType "z:\")

==> 4

(sysDriveType "q:\")

==> 5

Из приведенных результатов видно, что диски a: и i: - сменные; диски c: и e: - жесткие; диск z: - сетевой, а диск q: - компакт-диск.

SYSENV  

Функция SYSENV принимает один обязательный параметр: номер переменной окружения (типа FIXED, в диапазоне от 1 до 100) или имя переменной окружения (типа STRING). Если переменная окружения с заданным номером или именем не существует, функция возвращает Nil, а если существует - то в случае задания номера возвращается вся строка окружения в виде:

Имя=значение


В случае задания имени переменной окружения, функция возвращает только значение переменной.

Прежде, чем приводить примеры вызова SYSENV, следует отметить, что на компьютере пользователя значения переменных окружения, скорее всего, будут другими. Ниже показаны примеры вызова SYSENV:


(sysEnv 1)

==> "TMP=c:\windows\TEMP"

(sysEnv 2)

==> "TEMP=C:\windows\TEMP"

(sysEnv 3)

==> "winbootdir=C:\WINDOWS"

(sysEnv "winbootdir")

==> "C:\WINDOWS"

(sysEnv 0)

У функции sysEnv аргумент за пределами диапазона [1,100]
==> ERRSTATE

(sysEnv 40)

==> NIL

Следует обратить внимание на то, что при запросе третьей переменной окружения, функция возвращает строку вида Имя=Значение, а при запросе значения переменной окружения winbootdir возвращается только значение. Также, можно отметить, что переменной окружения с номером 40 на компьютере автора не существует.

Возникает естественный вопрос: как узнать число переменных окружения? В этом может помочь, например, приводимая функция numEnvVar:


(defun nEnvVar Nil 
  
               (prog (i) 
                     (setq i 1)
               @     (cond ((null (sysEnv i)) (return (- i 1))))
                     (setq i (+ 1 i))
                     (go @)
               )
) 


==> nEnvVar

(nEnvVar)

==> 12

На приведенной врезке видно, что на компьютере автора имеется двенадцать переменных окружения.

SYSERASE  

Функция SYSERASE принимает один обязательный параметр строкового типа - имя удаляемого файла. Если заданный файл существует и у пользователя есть права на его удаления, то файл будет удален, а функция вернет T. В противном случае возбуждается состояние ошибки и выдается сообщение с кодом ошибки. Имя файла может содержать диск и путь. Если задается "чистое" имя файла, то будет сделана попытка удалить файл из текущей директории.

Имя файла может содержать метасимволы * и ?. Если заданы метасимволы, то удаляются все файлы, имена которых удовлетворяют заданному шаблону. Так, если имя удаляемого файла имеет вид путь\*.*, то будут удалены все файлы. Излишне напоминать, что это делает функцию SYSERASE крайне опасной в неумелых руках!

Предположим, что в текущей директории имеется поддиректория с именем 111, и что в этой директории находятся только файлы типа .jpg и .ico. Тогда приводимые ниже две команды удалят из этой директории сначала все иконки (.ico), а затем - все картинки (.jpg). Следующая команда делает попытку очистить уже пустую директорию; естественно она вызывает ошибку.


(sysErase ".\111\*.ico")

==> T

(sysErase ".\111\*.jpg")

==> T

(sysErase ".\111\*.*")

sysErase - ошибка. Код=53
==> ERRSTATE
SYSEXEC  

Функция SYSEXEC позволяет запускать приложения Windows (как 16-битные, так и 32-х битные) и дожидаться их завершения. Функция ожидает три параметра:

1) Имя исполняемого файла приложения (типа STRING);

2) Командную строку (типа STRING);

3) Статус окна приложения (типа FIXED).

Имя исполняемого файла может содержать букву диска и путь. Если задано "чистое" имя файла, то этот файл ищется сначала в текущей директории, а затем во всех директориях, доступных через переменную окружения Path. Если файл приложения не найден ни в одной директории, то генерируется ошибка.

Статус окна приложения имеет смысл употреблять при запуске 16-битных (DOS-овых) или 32-битовых консольных приложений. Этот параметр может принимать такие значения:

Значение параметра Характеристика
0 Скрытое окно с фокусом
1 Нормальное окно с фокусом
2 Минимизированное окно с фокусом
3 Максимизированное окно с фокусом
4 Нормальное окно без фокуса
6 Минимизированное окно без фокуса


Ниже приводится пример вызова архиватора "pkzip.exe" для упаковки в текущей директории всех файлов с расширением ".bas" в архив all_bas.zip:


(sysExec "pkzip.exe" "all_bas.zip *.bas" 1)

==> 0

В процессе работы пользователь увидит окно следующего вида:

Чтобы после завершения 16-битного приложения его окно автоматически убиралось с экрана, рекомендуется создать для запускаемого приложения pif-файл и устновить свойство автоматически закрывать поcле завершения работы.

SYSGETATTR  

Функция SYSGETATTR принимает один обязательный параметр строкового тип - имя файла или директории. Функция возвращает список, содержащий следующие элементы:

1) Длина файла (для директории нуль)

2) Дата и время создания в виде "дд.мм.гггг чч:мм:сс"

3) Байт атрибутов в виде битовой константы. Биты байта атрибутов описаны в разделе, посвященном функции SYSDIR.

Если заданный файл или директория отсутствуют, то функция возвратиь Nil.

Вот примеры вызова функции SYSGETATTR:


(sysgetattr "c:\windows")

==> (0 "01.11.2001 10:43:08" &H10)

(sysgetattr "c:\файла.нет")

==> NIL

(sysgetattr "c:\autoexec.bat")

==> (1095 "04.06.2008 21:13:44" &H20)

В первом случае возвращаются сведения о директории C:\Windows. Видно, что C:\Windows - именно директория, поскольку в байте атрибутов поднят бит признака директории. Попытка запросить атрибуты несуществующего файла дает результат Nil. И, наконец, приводятся сведения о реально существующем файле c:\autoexec.bat.

SYSGETCOLOR  

Функция SYSGETCOLOR не принимает параметров. Назначение этой функции - вызов стандартного диалога выбора цвета. Функция возвращает выбранный пользователем цвет в виде битовой RGB-константы или Nil (в случае, когда пользователь нажал кнопку Отказаться).

Диалог выбора цвета выглядит так:



Вот примеры вызова функции SYSGETCOLOR:


(sysGetColor)

==> NIL

(sysGetColor)

==> &HFF0000

Сначала пользователь вызвал диалог выбора цвета и отказался от выбора. Во втором случае он выбрал красный цвет. Назначение функции состоит в возможности диалогового выбора пользователем нужного цвета во время выполнения программы.

SYSGETFONT  

Функция SYSGETFONT не принимает параметров. Назначение этой функции - вызов стандартного диалога выбора шрифта. Функция возвращает выбранный пользователем шрифт в виде списка свойств или Nil (в случае, когда пользователь нажал кнопку Отказаться).

Список свойств шрифта состоит из четырех элементов: имени шрифта, размера шрифта в пунктах и двух логических значений T/Nil. Первое из них отвечает за жирное начертание (Bold) или его отсутствие. Второе значение отвечает за курсивное начертание.

Диалог выбора шрифта выглядит так:



Вот примеры вызова функции SYSGETFONT:


(sysGetFont)

==> NIL

(sysGetFont)

==> ("Arial" 14 T T)

Сначала пользователь вызвал диалог выбора шрифта и отказался от выбора. Во втором случае он выбрал шрифт Arial размером 14 пунктов жирного и курсивного начертания. Назначение функции состоит в возможности диалогового выбора пользователем нужного шрифта во время выполнения программы.

SYSGETOPENNAME  

Назначение этой функции - вызов стандартного диалога OPEN (Открыть). Функция SYSGETOPENNAME принимает два обязательных параметра и один необязательный. Первый параметр - имя начальной директории, содержимое которой будет отображаться. Второй параметр задает фильтр имен файлов. Третий (необязательный) параметр задает заголовок окна диалога. Следует обратить внимание: функция не открывает выбранный файл, а только возвращает его имя.

Фильтр имеет следующую внутреннюю структуру:

Описание типа|шаблон типа|Описание типа|шаблон типа|...


Описание типа представляет собой произвольную строку (например, "Такстовые файлы") Шаблон типа задает шаблон поиска файлов в директории (например, *.txt).

Функция возвращает имя выбранного пользователем файла или Nil (в случае, когда пользователь нажал кнопку Отказаться).

Диалог "открыть" выглядит так:



Вот примеры вызова функции SYSGETOPENNAME:


(sysGetOpenName "c:\Windows" "Драйверы Windows|*.drv|Текстовые файлы|*.txt")

==> "C:\WINDOWS\ErrorLog.txt"

(sysGetOpenName "c:\Windows" "Драйверы Windows|*.drv|Текстовые файлы|*.txt")

==> NIL

Здесь видно, что пользователь выбрал диалог "Открыть" с двумя фильтрами "*.txt" и "*.drv". В процессе диалога был выбран файл "C:\WINDOWS\ErrorLog.txt". Во втором случае пользователь выбрал тот же набор фильтров, но не отказался от выбора файла.

SYSGETSAVENAME  

Назначение этой функции - вызов стандартного диалога SAVE AS (Сохранить как). Функция SYSGETSAVENAME принимает два обязательных параметра и один необязательный. Первый параметр - имя начальной директории, содержимое которой будет отображаться. Второй параметр задает фильтр имен файлов. Третий (необязательный) параметр задает заголовок окна диалога.

Фильтр имеет следующую внутреннюю структуру:

Описание типа|шаблон типа|Описание типа|шаблон типа|...


Описание типа представляет собой произвольную строку (например, "Такстовые файлы") Шаблон типа задает шаблон поиска файлов в директории (например, *.txt).

Функция возвращает имя выбранного пользователем файла или Nil (в случае, когда пользователь нажал кнопку Отказаться).

Диалог "Сохранить как" выглядит так:



Вот примеры вызова функции SYSGETSAVENAME:


(sysGetSaveName (sysHome) "Текст|*.txt|Лисп|*.lsp" "Выбор файла для сохранения")

==> "D:\Vb5ee\MYSOURCE\Samples.My\Lisp011\W.lsp"

(sysGetSaveName (sysHome) "Текст|*.txt|Лисп|*.lsp" "Выбор файла для сохранения")

==> NIL

Здесь видно, что пользователь выбрал диалог "Сохранить как" с двумя фильтрами "*.txt" и "*.lsp". В процессе диалога был выбран файл "W.lsp". Во втором случае пользователь выбрал тот же набор фильтров, но не отказался от выбора файла.

SYSHOME  

Функция SYSHOME не имеет параметров. Вызов этой функции возвращает имя текущей директории. Вот пример вызова функции SYSHOME:


(sysHome)

==> "D:\VB5EE\MYSOURCE\SAMPLES.MY\LISP011"
SYSLOGICALDRIVES  

Функция SYSLOGICALDRIVES не имеет параметров. Вызов этой функции возвращает битовую шкалу, в которой поднятый бит с номером n означает наличие логического диска с буквой из позиции n в последовательности ABCDEFGHIJKLMNOPQRSTUVWXYZ. Так, возврат шкалы &H5 означает наличие дисков A: и С:, поскольку в двоичном виде шкала &H5 имеет вид 00000101. Нумерация битов в шкале идет от младших разрядов к старшим (справа налево).

Чтобы не затрудняться битовыми операциями, можно использовать следующую функцию, dskList написанную на Лиспе. Эта функция без параметров возвращает список логических дисков компьютера в привычной нотации:


(defun dskList nil 
   (prog (Dsk i Ldsk mask)
         (setq Ldsk "")
         (setq Dsk (sysLogicalDrives))
         (for i 0 25 
            (
              (setq mask (fix2bit (^ 2 i)))
              (setq Ldsk
                    (strCat Ldsk 
                            (cond
                              ((neq (logand mask Dsk) &H0) (strCat (strChr (+ 65  i)) ": " )) 
                              (t "")
                            )
                    )
              )
            )
         )
         (return Ldsk)
   )
)

 ==> dskList

(dsklist)

 ==> "A: C: D: E: F: G: H: K: L: M: Q: W: X: Z: "
SYSMEMSTATUS  

Функция SYSMEMSTATUS не имеет параметров. Вызов этой функции возвращает список из семи чисел, означающих следующее:

1) Процент использования оперативной памяти;

2) Общий размер физической памяти в байтах;

3) Доступный размер физической памяти в байтах;

4) Общий размер страничного файла в байтах;

5) Доступный размер страничного файла в байтах;

6) Общий размер виртуальной памяти в байтах;

7) Доступный размер виртуальной памяти в байтах;

Ниже приводится пример вызова функции SYSMEMSTATUS:


(sysMemstatus)

==> (100.0 132612096 4096 2014867456 1833775104 2143289344 1986723840)
SYSMETRICS  

Функция SYSMETRICS принимает один параметр типа FIXED и, в зависимости от значения параметра, возвращает разнообразные системные метрики. Ниже приводятся допустимые значения параметров и возвращаемые результаты. Эти значения взяты из хелпа по Windows API ("Русский проект"; автор А. Климов)

Значение константы Результат
0 Возвращает ширину экрана.
1 Возвращает высоту экрана.
2 Начало позиции, помещающее значки в верхнем левом углу экрана.
2 только для Win 95/98: Возвращает ширину вертикальной полосы прокрутки.
3 Начало позиции, помещающее значки в верхнем правом углу экрана.
3 только для Win 95/98: Возвращает высоту горизонтальной полосы прокрутки.
4 Возвращает высоту нормальной области надписи.
5 Win NT: Возвращает ширину границы окна. Win 95/98: Возвратите ширину отдельной границы окна.
6 Win NT: Возвращает высоту границы окна. Win 95/98: Возвращает высоту отдельной границы окна.
7 только для Win NT: Возвращает ширину рамки окна, имеющей стиль диалогового окна.
8 Не размещает значки на экране (то есть, скрывает их).
8 только для Win NT: Возвращает высоту рамки окна, имеющей стиль диалога.
9 Возвращает высоту вертикального бегунка полосы прокрутки.
10 Возвращает ширину горизонтального бегунка полосы прокрутки.
11 Возвращает заданную по умолчанию ширину значка.
12 Возвращает заданную по умолчанию высоту значка.
13 Win NT: Возвращает ширину курсора. Win 95/98: Возвращает ширину стандартного точечного рисунка курсора.
14 Win NT: Возвращает высоту курсора. Win 95/98: Возвращает высоту стандартного точечного рисунка курсора.
15 Возвращает высоту отдельной строки меню.
16 Возвращает ширину клиентской области полноэкранного окна.
17 Возвращает высоту клиентской области полноэкранного окна.
18 Возвращает высоту окна Kanji (для версий набора символов с двойным байтом Windows).
19 Возвращает ненулевое значение, если мышь установлена и присутствует, 0 если нет.
20 только для Win 95/98: Возвращает высоту точечного рисунка стрелки на вертикальной полосе прокрутки.
21 только для Win 95/98: Возвращает ширину точечного рисунка стрелки на горизонтальной полосе прокрутки.
22 Возвращает ненулевое значение, если версия отладки USER.EXE установлена, 0 если нет.
23 Возвращает ненулевое значение, если левые и правые кнопки мыши поменялись, 0 если нет.
28 Возвращает минимальную ширину окна.
29 Возвращает минимальную высоту окна.
30 Win NT: Возвращает ширину точечного рисунка в заголовке. Win 95/98: Возвращает ширину кнопки заголовка.
31 Win NT: Возвращает высоту точечного рисунка области заголовка. Win 95/98: Возвращает высоту надписи кнопки.
32 только для Win NT: Возвращает ширину границы окна изменяемого размера.
32 только для Win 95/98: Возвращает ширину толстой рамки окна.
33 только для Win NT: Возвращает высоту границы окна изменяемого размера.
33 только для Win 95/98: Возвращает высоту толстой рамки окна.
34 только для Win 95/98: Возвращает заданную по умолчанию минимальную ширину
35 только для Win 95/98: Возвращает заданную по умолчанию минимальную высоту, если пользователю позволено изменять размеры окна.
36 Ширина прямоугольника, в пределах которого оба щелчка мыши должны быть опознаны,как двойной щелчок.
37 Возвращает высоту прямоугольника, в пределах которого оба щелчка мыши должны быть опознаны как двойной щелчок.
38 Win NT: Возвращает ширину ячейки для позиционирования значков. Win 95/98: Возвращает ширину ячейки сетки для элементов в виде крупных значков.
39 Win NT: Возвращает высоту ячейки для позиционирования значков. Win 95/98: Возвращает высоту ячейки сетки для элементов в представлении в виде крупных значков.
40 Возвращает ненулевое значение, если всплывающие меню появляются справа, 0 если слева.
41 Return a non-zero value if the Microsoft Windows for Pen computing extensions are installed, 0 if not.
42 Возвращает ненулевое значение, если версия набора символов с двойным байтом USER.EXE установлена, 0 если нет.
43 Возвращает число кнопок на установленной мыши, или 0, если мышь не установлена.
44 только для Win 95/98: Возвращает количество параметров системы.
44 Возвращает ненулевое значение, если защита присутствует и активна, 0 если нет.
45 только для Win 95/98: Возвращает ширину 3D границы окна.
46 только для Win 95/98: Возвращает высоту трехмерной границы окна.
47 только для Win 95/98: Возвращает ширину прямоугольника ячейки сетки используя позицию свернутого окна.
48 только для Win 95/98: Возвращает высоту прямоугольника ячейки сетки используемой для позиционирования свернутых окон.
49 только для Win 95/98: Возвращает рекомендуемую ширину для маленьких значков.
50 только для Win 95/98: Возвращает рекомендуемую высоту для маленьких значков.
51 только для Win 95/98: Возвращает высоту маленькой области заголовка.
52 только для Win 95/98: Возвращает ширину маленькой надписи кнопки.
53 только для Win 95/98: Возвращает высоту кнопки маленькой надписи.
54 только для Win 95/98: Возвращает ширину кнопки строки меню.
55 только для Win 95/98: Возвращает высоту кнопки строки меню.
56 только для Win 95/98: Возвращает метод отображения свернутых окон. Возвращаемое значение - комбинация двух из следующих флажков, одно определяет исходную позицию для свернутых значков и другое определяет направление, в котором новые значки будут добавлены:
57 только для Win 95/98: Возвращает ширину нормально свернутого окна.
58 только для Win 95/98: Возвращает высоту нормально свернутого окна.
59 только для Win 95/98: Возвращает заданную по умолчанию максимальную ширину,если пользователю разрешено изменять размеры окна.
60 только для Win 95/98: Возвращает заданную по умолчанию максимальную высоту,если пользователю позволено изменять размеры окна.
61 только для Win 95/98: Возвращает заданную по умолчанию ширину развернутого окна.
62 только для Win 95/98: Возвращает заданную по умолчанию высоту развернутого окна.
63 Установка &H1 бит возвращаемого значения, если сеть установлена. Все другие биты возвращаемого значения зарезервированы и неопределенны.
67 только для Win 95/98: Возвращает значение, определяющее, как компьютер был загружен. 0 - normal bootup, 1- fail-safe (a.k.a. SafeBoot) bootup, и 2 значит a fail-safe bootup with the network installed.
68 Возвращает минимальную ширину,при которой курсор должен двигаться, чтобы начать операцию перетаскивания.
69 Возвращает минимальную высоту,на которую курсор должен сдвинуться, чтобы начать операцию перетаскивания.
70 Возвращает ненулевое значение, если приложение показывает визуальную команду вызова программы для всех звуков, 0 если нет.
71 только для Win 95/98: Возвращает ширину заданного по умолчанию точечного рисунка метки меню.
72 только для Win 95/98: Возвращает высоту заданного по умолчанию точечного рисунка метки меню.
73 Возвращает ненулевое значение, если система имеет медленный процессор, 0 если нет.
74 Возвращает ненулевое значение, если система использует еврейский и арабские языки, 0 если нет.

Ниже приводится пример вызова функции SYSMETRICS для определения горизонтального и вертикального разрешения экран:


(sysMetrics 0)

==> 1024

(sysMetrics 1)

==> 768
SYSMKDIR  

Функция SYSMKDIR позволяет создать директорию. Она принимает имя создаваемой директории в виде значения типа STRING. Имя создаваемой директории может содержать букву диска и путь. Если имя не содержит пути, то делается попытка создать директорию, как поддиректорию текущей директории. При успешном создании директории функция возвращает T.

Ниже приводится пример вызова функции SYSMKDIR:


(sysMkdir "zzz")

==> T

(sysMkdir "zzz")

sysMkDir - ошибка. Код=75
==> ERRSTATE

Видно, что попытка создать поддиректорию ZZZ в текущей директории оказалась успешной. А повторная попытка вызывает ошибку, поскольку такая директория уже существует.

SYSMODE  

Функция SYSMODE позволяет программе распознать режим выполнения. Функция не имеет параметров. При вызове функции из интегрированной среды разработки, результат будет 1. При вызове функции из EXE-файла результат будет 2. А если вызвать функцию SYSMODE из кода, который использует библиотеку HomeLispLib.Exe, то результат будет 3.

SYSOSVER  

Функция SYSOSVER возвращает версию операционной системы в виде строки следующего вида:

"IdP/MajorV/MinorV Доп.Инф."

Здесь IdP - т.н. идентификатор платформы, принимающий значения 001 - Win-9x; 002 - Win-NT (а также - Win2k, WinXp).

MajorV - основной номер версии;

MinorV - дополнительный номер версии;

Доп.Инф. - дополнительная информация об операционной системе (в т.ч. версии сервиспаков);

SYSRENAME  

Функция SYSRENAME позволяет переименовывать файлы или директории. Функция принимает два параметра типа STRING. Первый параметр задает исходное имя, второй - целевое имя переименовываемого файла или директории. Если переименование прошло успешно - функция возвращает T.

Ниже приводится пример вызова функции SYSRENAME:


(sysMkdir "zzz")

==> T

(sysRename "zzz" "qqq")

==> T

(sysRename "aaaaaaaa.aaa" "bbbbbbbb.bbb")

==> T

(sysRename "bbbbbbbb.bbb" "d:\aaaaaaaa.aaa")

==> T

(sysDir ".\*.bbb" &H3F)

==> NIL

(sysDir "d:\*.aaa" &H3F)

==> ("aaaaaaaa.aaa")

В текущей директории создается поддиректория Zzz, которая затем переименовывается в Qqq. Затем существующий в текущей директории файл Aaaaaaaa.aaa переименовывается в Bbbbbbbb.bbb. Следующая команда переименовывает файл Bbbbbbbb.bbb в d:\Aaaaaaaa.aaa. При этом файл исчезает из текущей директории и оказывается в корне диска d: (что показывают последующие вызовы SysDir). Автор обращает внимание на то, что команда SysRename позволяет при переименовании менять букву целевого логического диска.

SYSRMDIR  

Функция SYSRMDIR позволяет удалить пустую директорию. Функция принимает единственный параметр типа STRING - имя удаляемой директории. Если переименование прошло успешно - функция возвращает T.

Ниже приводится пример вызова функции SYSRMDIR:


(sysMkdir "qqq")

==> T

(sysDir "qqq\*.*" &H3F)

==> (NIL)

(sysRmDir "qqq")

==> T

(sysRmDir "qqq")

sysRmDir - директория qqq не существует
==> ERRSTATE

(sysDir "Coll\*.*" &H3F)

==> ("P01" "P02" "P03" "P04")

(sysRmDir "Coll")

sysRmDir - ошибка. Код=75
==> ERRSTATE

В текущей директории создается поддиректория Qqq, которая затем успешно удаляется, поскольку является пустой. Повторная попытка удалить поддиректорию Qqq вызывает ошибку. Ошибку вызывает и попытка удалить непустую директорию Coll.

SYSSETATTR  

Функция SYSSETATTR позволяет установить или сбросить у файла или директории атрибуты элемента оглавления. Биты байта атрибутов описаны в разделе, посвященном функции SYSDIR. Функция требует два параметра: имя файла/директории (типа STRING) и новое значение байта атрибутов (типа BITS). Если функция завершается успешно, она возвращает T. В противном случае возбуждается сообщение об ошибке и выдается соответствующее сообщение. Функция SYSSETATTR, разумеется, не позволит установить у файла бит директории или метки тома. А вот установить у директории бит hidden вполне возможно.

Ниже приводится пример вызова функции SYSRMDIR:


(sysSetAttr "aaaaaaaa.aaa" &H06)

==> T

(sysSetAttr "aaaaaaaa.aaa" &H0)

==> T

(sysSetAttr "aaaaaaaa.aaa" &H10)

sysSetAttr - ошибка при установке атрибутов Код=5
==> ERRSTATE

У файла aaaaaaaa.aaa устанавливаются атрибуты скрытый системный. Потом эти биты сбрасываются. Обе операции завершаются успешно. А попытка установить бит директории у файла вызывает ошибку.

SYSSHELL  

Функция SYSSHELL принимает единственный параметр строкового типа - имя файла. Функция выполняет для заданного файла действия, предусмотренные расширением файла. Так, для расширения .doc запускается Microsoft Word и заданный файл загружается в окно документа. Для расширения .exe делается попытка выполнить заданный файл и т.д. Если действия удалось выполнить успешно, функция возвращает T. В случае возникновения ошибки функция возвращает код ошибки в соответствии с прилагаемой таблицей:

Код завершения Причина
2 Файл не найден
3 Путь не найден
5 Доступ запрещен
8 Не хватает памяти
11 Неверный формат EXE-файла или испорчен образ EXE-файла в памяти
26 Произошло нарушение защиты для разделяемого ресурса
32 DLL не найдена
27 Неполная или неверная ассоциация для файла
28 Истек тайм-аут у сервера DDE
29 Неудачное завершение DDE-транзакции
30 Сервер DDE занят
31 Для расширения не найдено ассоциации

SYSSYSDIR  

Функция SYSSYSDIR не требует параметров и возвращает имя системной директории:


(syssysdir)

==> "C:\WINDOWS"
SYSTIME  

Функция SYSTIME возвращает системное время. Функция имеет один необязательный аргумент строкового типа. Этот аргумент задает формат выводимого времени. Если аргумент опущен, время выдается в соответствии с установками пользователя.

Параметр функции (строка формата) может состоять из любых символов. Но следующие группы символов формата интерпретируются особым образом:

hh - часы;

mm - минуты;

ss - секунды;

Остальные символы строки формата просто копируются в строку-результат. Вот примеры вызова SYSTIME:


(systime)

==> "15:17:41"

(systime "hh:mm")

==> "15:17"

(systime "mm:hh")

==> "12:15"

(systime "ss")

==> "38"

(systime "Время hh:mm:ss")

==> "Время 15:18:12"

По последнему примеру можно убедиться, что при вызове функции без строки формата результат форматируется в соответствии с системными установками пользователя. В предпоследнем примере в строку формата внесен текст "Время:"; видно, что этот текст перенесен в результат без преобразования. Из примеров видно также, что можно задавать не все элементы формата. В этом случае возвращается часть времени (в соответствии с заданными элементами).

SYSTMPDIR  

Функция SYSTMPDIR не требует параметров и возвращает имя временной директории:


(systmpdir)

==> "c:\windows\TEMP\"
SYSTMPFILE  

Функция SYSTMPFILE позволяет построить имя временного файла в заданной директории.

Функция требует трех обязательных параметров. Первый параметр (типа STRING) задает имя директории, в которой будет создаваться временый файл. Второй параметр (тоже типа STRING)задает не более чем трехсивольный префикс имени файла (если задать более трех символов, то эффект окажут первые три). Третий параметр типа FIXED имеет следующий смысл:

Если значение параметра равно нулю, то строится временное имя и файл с этим именем создается в заданной директории. При этом гарантируется уникальность имени файла.

Если же значение параметра не равно нулю, то это значение переводится в шестадцатеричную систему и используется в качестве суффикса имени файла. Сам файл при этом не создается.

Ниже приводятся примеры вызова функции SYSTMPFILE.


(sysTmpFile (sysHome) "qwe" 45)

==> "D:\Vb5ee\MYSOURCE\Samples.My\Lisp011\qwe2D.TMP"

(sysTmpFile (sysHome) "qwe" 0)

==> "D:\Vb5ee\MYSOURCE\Samples.My\Lisp011\qweE335.TMP"

(sysTmpFile (sysHome) "ZXCVBN" 0)

==> "D:\Vb5ee\MYSOURCE\Samples.My\Lisp011\ZXC7203.TMP"

(sysTmpFile (sysHome) "Z" 0)

==> "D:\Vb5ee\MYSOURCE\Samples.My\Lisp011\Z8204.TMP"

(sysTmpFile (sysHome) "qwe" 45)

==> "D:\Vb5ee\MYSOURCE\Samples.My\Lisp011\qwe2D.TMP"

(sysDir (strCat (sysHome) "\*.tmp") &H3F)

==> ("ZXC7203.TMP" "Z8204.TMP" "QWEE335.TMP")

Следует обратить внимание на первый и последний вызовы: строится одинаковое имя файла (а сам файл не создается; последний вызов sysDir показывает, что созданы только файлы при нулевом значении третьего параметра). Кстати, 4510=2D16.

SYSUSERNAME  

Функция SYSUSERNAME не требует параметров и возвращает имя пользователя:


(sysusername)

==> "blfaifel"
SYSWINDIR  

Функция SYSWINDIR не требует параметров и возвращает имя системной директории Windows:


(syswindir)

==> "C:\WINDOWS"