任意引数のmap

30分プログラム、その411。昨日のやつにインスパイアされて、任意引数を受けとれるmapを作ってみた。

gosh> (map* + '(1 2 3) '(2 3 4))
(3 5 7)

実際のところGaucheのmapは、任意個の引数を取れるから必要はないんだけど。

使い方

gosh> (map* (+ <> 1) (list 1 2 3))
(2 3 4)

gosh> (map* + '(1 2 3) '(2 3 4))
(3 5 7)

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; map.scm -
;;
;; Copyright(C) 2008 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2008/11/11 22:43:41
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(use util.match)

(define (map-1 f xs)
  (match xs
   (() ())
   ((x . xs) (cons (f x)
		   (map-1 f xs)))))

(define (map* f . xs)
  (if (memq '() xs)
      '()
      (cons (apply f (map-1 car xs))
	    (apply map* f (map-1 cdr xs)))))