Я просто пытаюсь исправить код Хаззена:
(define (replace-nth list n elem)
(cond
((null? list) ())
((eq? n 0) (cons elem list))
(#t (cons(car list) (replace-nth (cdr list) (- n 1) elem)))))
> (replace-nth (list 3 2 9 2) 2 8)
(3 2 8 9 2)
Этот код вставил новый элемент в список. Если мы хотим заменить элемент:
(define (replace-nth list n elem)
(cond
((null? list) ())
((eq? n 0) (cons elem (cdr list)))
(#t (cons(car list) (replace-nth (cdr list) (- n 1) elem)))))
> (replace-nth (list 3 2 9 2) 2 8)
(3 2 8 2)
0 < = n < = длина (список) - 1
Ваш make-файл будет выглядеть примерно так
code.compressed.js: code.js
compressor -o $@ $<
Обратите внимание, что вторая строка имеет отступ с помощью символа табуляции , а не только пробелов. Об этом заботится утилита make.
code.compressed.js
- это имя, в которое должен быть записан файл, code.js
- это файл для сжатия, а компрессор
- это программа, выполняющая сжатие.
Флаг -o
указывает выходной файл в соответствии с соглашением компиляторов и аналогичных инструментов. Ваш может отличаться; проверьте его документацию.
Переменная $ @
- это сокращение Makefile для «цели этого правила», в данном случае code.compressed.js
. Точно так же $ <
- это аббревиатура для «первой зависимости этого правила». Эти переменные полезны, так что вам не нужно ни повторяться, ни делать повторяющиеся изменения при переименовании файлов.
Если у вас есть несколько файлов, которые будут сжаты в один выходной файл, вы можете поместить их все в строку зависимости. , а затем используйте специальную переменную $ ^
в правиле сборки , чтобы указать их все:
code.compressed.js: code1.js code2.js
compressor -o $@ $^
В качестве альтернативы, если вы хотите, чтобы каждый из них был сжат по отдельности, вы можете написать шаблонное правило и используйте его для всех:
TARGETS = code1.cjs code2.cjs code3.cjs
all: $(TARGETS)
%.cjs: %.js
compressor -o $@ $<
Сделайте по умолчанию создание первой цели, которую он видит, в данном случае это все
. Список файлов для сжатия задается содержимым переменной TARGET
. %
- это подстановочный знак, который make заменит для создания правил сопоставления имен исходного и целевого файлов.