Абсолютно первое использование схемы, простая работа со списком

Я летаю вслепую по схеме, и мне кажется, что как только я отвечу на этот вопрос, остальная часть моей домашней работы должна пройти гладко.

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

(addFirst ‘(4 3 2 1))   =>   (8 7 6 5)

У меня есть ощущение, что я должен использовать здесь функции карты и машины... но я просто не могу понять это правильно. Моя текущая версия этого кода выглядит так:

(define (addlist x) ;adds the first element of a list to all other elements
  (define a (car x)) ;a is definitely the first part of the list
  (map (+ a) x)
)

Как я могу заставить функцию сложения работать таким образом? Очевидно, я не могу предоставить список в качестве параметра, но должен ли я снова использовать автомобиль или рекурсию?

Хорошо, для потомков, вот завершенный, правильный, отформатированный код:

(define (addlist x) ;adds the first element of a list to all other elements
  (define a (car x)) ;a is definitely the first part of the list
  (map (lambda (y) (+ a y)) x)
)

person Ryanman    schedule 21.03.2012    source источник
comment
Интересно, что в вашей первой попытке вы, кажется, думаете как программист на Haskell, где выражение (+) a действительно возвращает функцию, которая добавляет a к своему аргументу.   -  person gcbenison    schedule 21.03.2012


Ответы (1)


Map принимает функцию и n списков. Итак, вам нужно преобразовать (+ a) в функцию, которая принимает один аргумент (так как вы хотите отобразить один список).

(map (lambda (item) ... do something to add a to item ...) x)
person Ross Larson    schedule 21.03.2012
comment
Вы совершенно правы, я только что понял это. Я опубликую готовый код в качестве ответа, еще раз спасибо. - person Ryanman; 21.03.2012
comment
Без проблем. Счастливого замысла! (или это будет интрига?) - person Ross Larson; 21.03.2012
comment
Так что я не могу ответить на свой вопрос еще 8 часов. - person Ryanman; 21.03.2012
comment
Итак, это было так просто, как казалось. Наверное, я зациклился на определении процедуры и функции здесь. Вот завершенный код, который делает именно то, что мне нужно: (define (addlist x); добавляет первый элемент списка ко всем остальным элементам (define a (car x)); a определенно является первой частью списка. (map (лямбда (y) (+ ay)) x)) Еще раз спасибо @Ross Larson - person Ryanman; 21.03.2012
comment
Похоже, вы новичок в Stack Overflow: поставьте лайк @RossLarson и нажмите на галочку рядом с его ответом. - person John Clements; 22.03.2012
comment
Готово и сделано! Забыл сделать это перед тем, как выбежать из лаборатории этим утром. - person Ryanman; 22.03.2012