All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dakusui.lisj.special.Lambda Maven / Gradle / Ivy

package com.github.dakusui.lisj.special;

import org.apache.commons.lang3.ArrayUtils;

import com.github.dakusui.jcunit.core.Utils;
import com.github.dakusui.jcunit.exceptions.JCUnitException;
import com.github.dakusui.lisj.BaseForm;
import com.github.dakusui.lisj.CUT;
import com.github.dakusui.lisj.Context;
import com.github.dakusui.lisj.FormResult;
import com.github.dakusui.lisj.Symbol;

public class Lambda extends BaseForm {

	/**
	 * Serial version UID
	 */
	private static final long serialVersionUID = 7978574769583650805L;

	@Override
	protected FormResult evaluateEach(Context context, Object currentParam,
			FormResult lastResult) throws JCUnitException, CUT {
		lastResult.incrementPosition();
		lastResult.value(currentParam);
		return lastResult;
	}

	@Override
	protected FormResult evaluateLast(Context context,
			final Object[] evaluatedParams, FormResult lastResult)
			throws JCUnitException, CUT {
		FormResult ret = lastResult;
		
		final Symbol[] paramSymbols = Utils.cast(Symbol[].class, Utils.checknull(evaluatedParams[0]));
		final Object[] funcBody = ArrayUtils.subarray(evaluatedParams, 1, evaluatedParams.length);
		
		ret.value(new BaseForm() {
			private static final long serialVersionUID = 1L;

			@Override
			protected FormResult evaluateEach(Context context,
					Object currentParam, FormResult lastResult)
					throws JCUnitException, CUT {
				FormResult ret = lastResult;
				
				ret.value(context.bind((Symbol) paramSymbols[lastResult.nextPosition()], currentParam));
				ret.incrementPosition();
				
				return ret;
			}

			@Override
			protected FormResult evaluateLast(
					Context context,
					Object[] evaluatedParams, 
					FormResult lastResult
						) throws JCUnitException, CUT {	
				FormResult ret = lastResult;
				for (Object cur : funcBody) {
					ret = evaluateEachSimply(context, cur, ret);
				}
				return ret;
			}
			
			@Override
			public String name() {
				return "(lambda)";
			}
		});
		return ret;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy