#lang racket
(provide (all-defined-out))
(define current-source-name (make-parameter #f))
(define (make-stx v ln col pos span)
(datum->syntax #f v
(list (current-source-name) ln col pos span)))
(define/contract (syntax-cons stx1 stx2)
(-> syntax? syntax? syntax?)
(define src (syntax-source stx1))
(define line (syntax-line stx1))
(define col (syntax-column stx1))
(define start (syntax-position stx1))
(define end (+ (syntax-position stx2)
(syntax-span stx2)))
(define span (- end start))
(datum->syntax
#f
(cons stx1 (syntax-e stx2))
(list src line col start span)))
(define/contract (syntax-list stx1 stx2)
(-> syntax? syntax? syntax?)
(define src (syntax-source stx1))
(define line (syntax-line stx1))
(define col (syntax-column stx1))
(define pos (syntax-position stx1))
(define span (+ (syntax-span stx1)
(syntax-span stx2)))
(datum->syntax
#f
(list stx1 (syntax-e stx2))
(list src line col pos span)))